How do I run a program with a different working directory from current, from Linux shell?

LinuxShellEnvironment

Linux Problem Overview


Using a Linux shell, how do I start a program with a different working directory from the current working directory?

For example, I have a binary file helloworld that creates the file hello-world.txt in the current directory.

This file is inside of directory /a.

Currently, I am in the directory /b. I want to start my program running ../a/helloworld and get the hello-world.txt somewhere in a third directory /c.

Linux Solutions


Solution 1 - Linux

Call the program like this:

(cd /c; /a/helloworld)

The parentheses cause a sub-shell to be spawned. This sub-shell then changes its working directory to /c, then executes helloworld from /a. After the program exits, the sub-shell terminates, returning you to your prompt of the parent shell, in the directory you started from.

Error handling: To avoid running the program without having changed the directory, e.g. when having misspelled /c, make the execution of helloworld conditional:

(cd /c && /a/helloworld)

Reducing memory usage: To avoid having the subshell waste memory while hello world executes, call helloworld via exec:

(cd /c && exec /a/helloworld)

[Thanks to Josh and Juliano for giving tips on improving this answer!]

Solution 2 - Linux

Similar to David Schmitt's answer, plus Josh's suggestion, but doesn't leave a shell process running:

(cd /c && exec /a/helloworld)

This way is more similar to how you usually run commands on the shell. To see the practical difference, you have to run ps ef from another shell with each solution.

Solution 3 - Linux

An option which doesn't require a subshell and is built in to bash

(pushd SOME_PATH && run_stuff; popd)

Demo:

$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit

Solution 4 - Linux

sh -c 'cd /c && ../a/helloworld'

Solution 5 - Linux

Just change the last "&&" into ";" and it will cd back no matter if the command fails or succeeds:

cd SOME_PATH && run_some_command ; cd -

Solution 6 - Linux

I always think UNIX tools should be written as filters, read input from stdin and write output to stdout. If possible you could change your helloworld binary to write the contents of the text file to stdout rather than a specific file. That way you can use the shell to write your file anywhere.

$ cd ~/b

$ ~/a/helloworld > ~/c/helloworld.txt

Solution 7 - Linux

One way to do that is to create a wrapper shell script.

The shell script would change the current directory to /c, then run /a/helloworld. Once the shell script exits, the current directory reverts back to /b.

Here's a bash shell script example:

#!/bin/bash
cd /c
/a/helloworld

Solution 8 - Linux

why not keep it simple

cd SOME_PATH && run_some_command && cd -

the last 'cd' command will take you back to the last pwd directory. This should work on all *nix systems.

Solution 9 - Linux

If you always want it to go to /C, use an absolute path when you write the file.

Solution 10 - Linux

If you want to perform this inside your program then I would do something like:

#include <unistd.h>
int main()
{
  if(chdir("/c") < 0 )  
  {
     printf("Failed\n");
     return -1 ;
  }

  // rest of your program...

}

Solution 11 - Linux

from the current directory provide the full path to the script directory to execute the command

/root/server/user/home/bin/script.sh

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAnton DaneykoView Question on Stackoverflow
Solution 1 - LinuxDavid SchmittView Answer on Stackoverflow
Solution 2 - LinuxJulianoView Answer on Stackoverflow
Solution 3 - LinuxLorenView Answer on Stackoverflow
Solution 4 - LinuxmihiView Answer on Stackoverflow
Solution 5 - LinuxjohnnybravoView Answer on Stackoverflow
Solution 6 - LinuxLuther BlissetView Answer on Stackoverflow
Solution 7 - LinuxJin KimView Answer on Stackoverflow
Solution 8 - LinuxSahilView Answer on Stackoverflow
Solution 9 - LinuxTom RitterView Answer on Stackoverflow
Solution 10 - LinuxHaroldView Answer on Stackoverflow
Solution 11 - LinuxRavi BhushanView Answer on Stackoverflow