Is there a POSIX (or at least a popular) utility to set the current working directory when invoking a program?
Clash Royale CLAN TAG#URR8PPP
up vote
4
down vote
favorite
We have env(1) to modify the environment of the command we want to run (for example env MANPAGER=more man dtrace
). Is there something similar but for modifying the directory that the command is going to be started in?
Ideally, I would like it to look like this:
theMagicCommand /new/cwd myProgram
This way it could be "chained" with other env(1)-like commands, e.g.,
daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram
So far I can think of the following solution, which unfortunately do not have the same interface as env(1):
cd /new/cwd && myProgram
Also, I can just create a simple shell script like this:
#! /bin/sh -
cd "$1:?Missing the new working directory" || exit 1
shift
exec "$@:?Missing the command to run"
but I am looking for something that already exists (at least on macOS and FreeBSD).
myProgram
is not necessarily a desktop application (in which case I could just use the Path key in a .desktop file).
shell freebsd cwd
add a comment |
up vote
4
down vote
favorite
We have env(1) to modify the environment of the command we want to run (for example env MANPAGER=more man dtrace
). Is there something similar but for modifying the directory that the command is going to be started in?
Ideally, I would like it to look like this:
theMagicCommand /new/cwd myProgram
This way it could be "chained" with other env(1)-like commands, e.g.,
daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram
So far I can think of the following solution, which unfortunately do not have the same interface as env(1):
cd /new/cwd && myProgram
Also, I can just create a simple shell script like this:
#! /bin/sh -
cd "$1:?Missing the new working directory" || exit 1
shift
exec "$@:?Missing the command to run"
but I am looking for something that already exists (at least on macOS and FreeBSD).
myProgram
is not necessarily a desktop application (in which case I could just use the Path key in a .desktop file).
shell freebsd cwd
add a comment |
up vote
4
down vote
favorite
up vote
4
down vote
favorite
We have env(1) to modify the environment of the command we want to run (for example env MANPAGER=more man dtrace
). Is there something similar but for modifying the directory that the command is going to be started in?
Ideally, I would like it to look like this:
theMagicCommand /new/cwd myProgram
This way it could be "chained" with other env(1)-like commands, e.g.,
daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram
So far I can think of the following solution, which unfortunately do not have the same interface as env(1):
cd /new/cwd && myProgram
Also, I can just create a simple shell script like this:
#! /bin/sh -
cd "$1:?Missing the new working directory" || exit 1
shift
exec "$@:?Missing the command to run"
but I am looking for something that already exists (at least on macOS and FreeBSD).
myProgram
is not necessarily a desktop application (in which case I could just use the Path key in a .desktop file).
shell freebsd cwd
We have env(1) to modify the environment of the command we want to run (for example env MANPAGER=more man dtrace
). Is there something similar but for modifying the directory that the command is going to be started in?
Ideally, I would like it to look like this:
theMagicCommand /new/cwd myProgram
This way it could be "chained" with other env(1)-like commands, e.g.,
daemon -p /tmp/pid env VAR=value theMagicCommand /new/cwd myProgram
So far I can think of the following solution, which unfortunately do not have the same interface as env(1):
cd /new/cwd && myProgram
Also, I can just create a simple shell script like this:
#! /bin/sh -
cd "$1:?Missing the new working directory" || exit 1
shift
exec "$@:?Missing the command to run"
but I am looking for something that already exists (at least on macOS and FreeBSD).
myProgram
is not necessarily a desktop application (in which case I could just use the Path key in a .desktop file).
shell freebsd cwd
shell freebsd cwd
edited 43 mins ago
asked 1 hour ago


Mateusz Piotrowski
1,78421537
1,78421537
add a comment |
add a comment |
3 Answers
3
active
oldest
votes
up vote
4
down vote
AFAIK, there is no such dedicated utility in the POSIX tool chest. But it's common to invoke sh
to set up an environment (cwd, limits, stdout/in/err, umask...) before running a command as you do in your sh
script.
But you don't have to write that script in a file, you can just inline it:
sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args
(assuming the directory is not -
). Adding CDPATH=
(in case there's one in the environment) and -P
for it to behave more like a straight chdir()
.
Alternatively, you could use perl
whose chdir()
does a straight chdir()
out of the box.
perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
' /some/dir cmd args
Oh, yeah. This is indded a very handy variation of the script I included in my question. I was afraid that the utility I am looking for does not exist since its functionality is already available with a relatively short sh(1) oneliner.
– Mateusz Piotrowski
1 hour ago
add a comment |
up vote
1
down vote
You could use a subshell:
$ pwd
/home/user
$ (cd /bin && pwd)
/bin
$ pwd
/home/user
A possible downside of this approach is that the values of the variables are not preserved in the parent shell, but it may be useful in certain cases:
$ var=foo; echo "$var"
foo
$ (var=bar; echo "$var")
bar
$ echo "$var"
foo
A subshell is not a solution. It is not a utility and unfortunately it cannot be chained the way you can chain env(1)-like variables.
– Mateusz Piotrowski
42 mins ago
@MateuszPiotrowski Would this approach be valid if you put the entire chain of commands within the subshell? If I understand correctly, it will be basically the same as having a separate script or explicitly calling another interpreter, at least in a shell context.
– nxnev
32 mins ago
In a way, yes. In order to use a subshell we have to be in a shell of some sort. In case you'd like to feed this command to execve you'd have to wrap your subshell insh -c
anyway.
– Mateusz Piotrowski
21 mins ago
add a comment |
up vote
0
down vote
The toolsets used in the daemontools world, and elsewhere, have this and more besides; have had for many years; and are widely available.
- Wayne Marshall's perp has
runtool
:runtool -c /new/cwd myProgram
- Laurent Bercot's execline has
cd
:cd /new/cwd myProgram
my nosh toolset haschdir
:chdir /new/cwd myProgram
All of these are chain-loading tools, designed to be used in exactly these sorts of chains. There is a wide selection of chain-loading tools in these toolkits for other purposes.
Further reading
- https://unix.stackexchange.com/a/353698/5132
- Laurent Bercot (2018-08-01). "Reference". execline. skarnet.org.
- Laurent Bercot (2018-11-08). "Reference". s6. skarnet.org.
- Jonathan de Boyne Pollard (2018). "Command and tool list". nosh Guide. Softwares.
add a comment |
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
4
down vote
AFAIK, there is no such dedicated utility in the POSIX tool chest. But it's common to invoke sh
to set up an environment (cwd, limits, stdout/in/err, umask...) before running a command as you do in your sh
script.
But you don't have to write that script in a file, you can just inline it:
sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args
(assuming the directory is not -
). Adding CDPATH=
(in case there's one in the environment) and -P
for it to behave more like a straight chdir()
.
Alternatively, you could use perl
whose chdir()
does a straight chdir()
out of the box.
perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
' /some/dir cmd args
Oh, yeah. This is indded a very handy variation of the script I included in my question. I was afraid that the utility I am looking for does not exist since its functionality is already available with a relatively short sh(1) oneliner.
– Mateusz Piotrowski
1 hour ago
add a comment |
up vote
4
down vote
AFAIK, there is no such dedicated utility in the POSIX tool chest. But it's common to invoke sh
to set up an environment (cwd, limits, stdout/in/err, umask...) before running a command as you do in your sh
script.
But you don't have to write that script in a file, you can just inline it:
sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args
(assuming the directory is not -
). Adding CDPATH=
(in case there's one in the environment) and -P
for it to behave more like a straight chdir()
.
Alternatively, you could use perl
whose chdir()
does a straight chdir()
out of the box.
perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
' /some/dir cmd args
Oh, yeah. This is indded a very handy variation of the script I included in my question. I was afraid that the utility I am looking for does not exist since its functionality is already available with a relatively short sh(1) oneliner.
– Mateusz Piotrowski
1 hour ago
add a comment |
up vote
4
down vote
up vote
4
down vote
AFAIK, there is no such dedicated utility in the POSIX tool chest. But it's common to invoke sh
to set up an environment (cwd, limits, stdout/in/err, umask...) before running a command as you do in your sh
script.
But you don't have to write that script in a file, you can just inline it:
sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args
(assuming the directory is not -
). Adding CDPATH=
(in case there's one in the environment) and -P
for it to behave more like a straight chdir()
.
Alternatively, you could use perl
whose chdir()
does a straight chdir()
out of the box.
perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
' /some/dir cmd args
AFAIK, there is no such dedicated utility in the POSIX tool chest. But it's common to invoke sh
to set up an environment (cwd, limits, stdout/in/err, umask...) before running a command as you do in your sh
script.
But you don't have to write that script in a file, you can just inline it:
sh -c 'CDPATH= cd -P -- "$1" && shift && exec "$@"' sh /some/dir cmd args
(assuming the directory is not -
). Adding CDPATH=
(in case there's one in the environment) and -P
for it to behave more like a straight chdir()
.
Alternatively, you could use perl
whose chdir()
does a straight chdir()
out of the box.
perl -e 'chdir(shift@ARGV) or die "chdir: $!"; exec @ARGV or die "exec: $!"
' /some/dir cmd args
edited 1 hour ago
answered 1 hour ago


Stéphane Chazelas
292k54544884
292k54544884
Oh, yeah. This is indded a very handy variation of the script I included in my question. I was afraid that the utility I am looking for does not exist since its functionality is already available with a relatively short sh(1) oneliner.
– Mateusz Piotrowski
1 hour ago
add a comment |
Oh, yeah. This is indded a very handy variation of the script I included in my question. I was afraid that the utility I am looking for does not exist since its functionality is already available with a relatively short sh(1) oneliner.
– Mateusz Piotrowski
1 hour ago
Oh, yeah. This is indded a very handy variation of the script I included in my question. I was afraid that the utility I am looking for does not exist since its functionality is already available with a relatively short sh(1) oneliner.
– Mateusz Piotrowski
1 hour ago
Oh, yeah. This is indded a very handy variation of the script I included in my question. I was afraid that the utility I am looking for does not exist since its functionality is already available with a relatively short sh(1) oneliner.
– Mateusz Piotrowski
1 hour ago
add a comment |
up vote
1
down vote
You could use a subshell:
$ pwd
/home/user
$ (cd /bin && pwd)
/bin
$ pwd
/home/user
A possible downside of this approach is that the values of the variables are not preserved in the parent shell, but it may be useful in certain cases:
$ var=foo; echo "$var"
foo
$ (var=bar; echo "$var")
bar
$ echo "$var"
foo
A subshell is not a solution. It is not a utility and unfortunately it cannot be chained the way you can chain env(1)-like variables.
– Mateusz Piotrowski
42 mins ago
@MateuszPiotrowski Would this approach be valid if you put the entire chain of commands within the subshell? If I understand correctly, it will be basically the same as having a separate script or explicitly calling another interpreter, at least in a shell context.
– nxnev
32 mins ago
In a way, yes. In order to use a subshell we have to be in a shell of some sort. In case you'd like to feed this command to execve you'd have to wrap your subshell insh -c
anyway.
– Mateusz Piotrowski
21 mins ago
add a comment |
up vote
1
down vote
You could use a subshell:
$ pwd
/home/user
$ (cd /bin && pwd)
/bin
$ pwd
/home/user
A possible downside of this approach is that the values of the variables are not preserved in the parent shell, but it may be useful in certain cases:
$ var=foo; echo "$var"
foo
$ (var=bar; echo "$var")
bar
$ echo "$var"
foo
A subshell is not a solution. It is not a utility and unfortunately it cannot be chained the way you can chain env(1)-like variables.
– Mateusz Piotrowski
42 mins ago
@MateuszPiotrowski Would this approach be valid if you put the entire chain of commands within the subshell? If I understand correctly, it will be basically the same as having a separate script or explicitly calling another interpreter, at least in a shell context.
– nxnev
32 mins ago
In a way, yes. In order to use a subshell we have to be in a shell of some sort. In case you'd like to feed this command to execve you'd have to wrap your subshell insh -c
anyway.
– Mateusz Piotrowski
21 mins ago
add a comment |
up vote
1
down vote
up vote
1
down vote
You could use a subshell:
$ pwd
/home/user
$ (cd /bin && pwd)
/bin
$ pwd
/home/user
A possible downside of this approach is that the values of the variables are not preserved in the parent shell, but it may be useful in certain cases:
$ var=foo; echo "$var"
foo
$ (var=bar; echo "$var")
bar
$ echo "$var"
foo
You could use a subshell:
$ pwd
/home/user
$ (cd /bin && pwd)
/bin
$ pwd
/home/user
A possible downside of this approach is that the values of the variables are not preserved in the parent shell, but it may be useful in certain cases:
$ var=foo; echo "$var"
foo
$ (var=bar; echo "$var")
bar
$ echo "$var"
foo
answered 53 mins ago


nxnev
2,5482423
2,5482423
A subshell is not a solution. It is not a utility and unfortunately it cannot be chained the way you can chain env(1)-like variables.
– Mateusz Piotrowski
42 mins ago
@MateuszPiotrowski Would this approach be valid if you put the entire chain of commands within the subshell? If I understand correctly, it will be basically the same as having a separate script or explicitly calling another interpreter, at least in a shell context.
– nxnev
32 mins ago
In a way, yes. In order to use a subshell we have to be in a shell of some sort. In case you'd like to feed this command to execve you'd have to wrap your subshell insh -c
anyway.
– Mateusz Piotrowski
21 mins ago
add a comment |
A subshell is not a solution. It is not a utility and unfortunately it cannot be chained the way you can chain env(1)-like variables.
– Mateusz Piotrowski
42 mins ago
@MateuszPiotrowski Would this approach be valid if you put the entire chain of commands within the subshell? If I understand correctly, it will be basically the same as having a separate script or explicitly calling another interpreter, at least in a shell context.
– nxnev
32 mins ago
In a way, yes. In order to use a subshell we have to be in a shell of some sort. In case you'd like to feed this command to execve you'd have to wrap your subshell insh -c
anyway.
– Mateusz Piotrowski
21 mins ago
A subshell is not a solution. It is not a utility and unfortunately it cannot be chained the way you can chain env(1)-like variables.
– Mateusz Piotrowski
42 mins ago
A subshell is not a solution. It is not a utility and unfortunately it cannot be chained the way you can chain env(1)-like variables.
– Mateusz Piotrowski
42 mins ago
@MateuszPiotrowski Would this approach be valid if you put the entire chain of commands within the subshell? If I understand correctly, it will be basically the same as having a separate script or explicitly calling another interpreter, at least in a shell context.
– nxnev
32 mins ago
@MateuszPiotrowski Would this approach be valid if you put the entire chain of commands within the subshell? If I understand correctly, it will be basically the same as having a separate script or explicitly calling another interpreter, at least in a shell context.
– nxnev
32 mins ago
In a way, yes. In order to use a subshell we have to be in a shell of some sort. In case you'd like to feed this command to execve you'd have to wrap your subshell in
sh -c
anyway.– Mateusz Piotrowski
21 mins ago
In a way, yes. In order to use a subshell we have to be in a shell of some sort. In case you'd like to feed this command to execve you'd have to wrap your subshell in
sh -c
anyway.– Mateusz Piotrowski
21 mins ago
add a comment |
up vote
0
down vote
The toolsets used in the daemontools world, and elsewhere, have this and more besides; have had for many years; and are widely available.
- Wayne Marshall's perp has
runtool
:runtool -c /new/cwd myProgram
- Laurent Bercot's execline has
cd
:cd /new/cwd myProgram
my nosh toolset haschdir
:chdir /new/cwd myProgram
All of these are chain-loading tools, designed to be used in exactly these sorts of chains. There is a wide selection of chain-loading tools in these toolkits for other purposes.
Further reading
- https://unix.stackexchange.com/a/353698/5132
- Laurent Bercot (2018-08-01). "Reference". execline. skarnet.org.
- Laurent Bercot (2018-11-08). "Reference". s6. skarnet.org.
- Jonathan de Boyne Pollard (2018). "Command and tool list". nosh Guide. Softwares.
add a comment |
up vote
0
down vote
The toolsets used in the daemontools world, and elsewhere, have this and more besides; have had for many years; and are widely available.
- Wayne Marshall's perp has
runtool
:runtool -c /new/cwd myProgram
- Laurent Bercot's execline has
cd
:cd /new/cwd myProgram
my nosh toolset haschdir
:chdir /new/cwd myProgram
All of these are chain-loading tools, designed to be used in exactly these sorts of chains. There is a wide selection of chain-loading tools in these toolkits for other purposes.
Further reading
- https://unix.stackexchange.com/a/353698/5132
- Laurent Bercot (2018-08-01). "Reference". execline. skarnet.org.
- Laurent Bercot (2018-11-08). "Reference". s6. skarnet.org.
- Jonathan de Boyne Pollard (2018). "Command and tool list". nosh Guide. Softwares.
add a comment |
up vote
0
down vote
up vote
0
down vote
The toolsets used in the daemontools world, and elsewhere, have this and more besides; have had for many years; and are widely available.
- Wayne Marshall's perp has
runtool
:runtool -c /new/cwd myProgram
- Laurent Bercot's execline has
cd
:cd /new/cwd myProgram
my nosh toolset haschdir
:chdir /new/cwd myProgram
All of these are chain-loading tools, designed to be used in exactly these sorts of chains. There is a wide selection of chain-loading tools in these toolkits for other purposes.
Further reading
- https://unix.stackexchange.com/a/353698/5132
- Laurent Bercot (2018-08-01). "Reference". execline. skarnet.org.
- Laurent Bercot (2018-11-08). "Reference". s6. skarnet.org.
- Jonathan de Boyne Pollard (2018). "Command and tool list". nosh Guide. Softwares.
The toolsets used in the daemontools world, and elsewhere, have this and more besides; have had for many years; and are widely available.
- Wayne Marshall's perp has
runtool
:runtool -c /new/cwd myProgram
- Laurent Bercot's execline has
cd
:cd /new/cwd myProgram
my nosh toolset haschdir
:chdir /new/cwd myProgram
All of these are chain-loading tools, designed to be used in exactly these sorts of chains. There is a wide selection of chain-loading tools in these toolkits for other purposes.
Further reading
- https://unix.stackexchange.com/a/353698/5132
- Laurent Bercot (2018-08-01). "Reference". execline. skarnet.org.
- Laurent Bercot (2018-11-08). "Reference". s6. skarnet.org.
- Jonathan de Boyne Pollard (2018). "Command and tool list". nosh Guide. Softwares.
answered 24 secs ago
JdeBP
31.1k465142
31.1k465142
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f480776%2fis-there-a-posix-or-at-least-a-popular-utility-to-set-the-current-working-dire%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password