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 directory /b
. I want to start my program running ../a/helloworld
and get the hello-world.txt
somewhere in a third directory /c
.
Similar to David Schmitt's answer, plus Josh's suggestion, but doesn't leave a shell process running:
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.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
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:
Call the program like this:
The parentheses cause a sub-shell to be spawned. This sub-shell then changes its working directory to
/c
, then executeshelloworld
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 ofhelloworld
conditional:Reducing memory usage: To avoid having the subshell waste memory while hello world executes, call
helloworld
via exec:[Thanks to Josh and Juliano for giving tips on improving this answer!]