Answers:
像这样调用程序:
(cd /c; /a/helloworld)
括号导致生成子壳。然后,该子外壳将其工作目录更改为/c
,然后helloworld
从执行/a
。程序退出后,子Shell终止,返回到您从其开始的目录中的父Shell提示符。
错误处理:为了避免在未更改目录的情况下运行程序,例如,拼写错误时/c
,请执行以下helloworld
条件:
(cd /c && /a/helloworld)
减少内存使用量:为了避免在hello world执行期间子外壳浪费内存,请helloworld
通过exec 调用:
(cd /c && exec /a/helloworld)
[感谢Josh和Juliano提供改善此答案的提示!]
与David Schmitt的答案类似,再加上Josh的建议,但并没有使Shell进程继续运行:
(cd /c && exec /a/helloworld)
这种方式与通常在shell上运行命令的方式更相似。要查看实际的差异,ps ef
每个解决方案都必须从另一个shell 运行。
一个不需要子shell并且内置于bash中的选项
(pushd SOME_PATH && run_stuff; popd)
演示:
$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit
pushd SOME_PATH && run_stuff && popd
-如果run_stuff失败,则不会执行popd。
set -e
文件中使用它,然后失败popd
。
pushd "${SOME_PATH}" && run_stuff; popd
它比当前答案更好,因为push / popd语义是专门为这种情况而设计的,即进入某个目录然后返回到原始目录。
我一直认为UNIX工具应该写为过滤器,从stdin读取输入并将输出写入stdout。如果可能,您可以更改helloworld二进制文件,以将文本文件的内容写入stdout而不是特定文件。这样,您可以使用Shell在任何位置写入文件。
$ cd〜/ b
$〜/ a / helloworld>〜/ c / helloworld.txt
为什么不保持简单
cd SOME_PATH && run_some_command && cd -
最后一个“ cd”命令将带您回到最后一个pwd目录。这应该适用于所有* nix系统。
run_some_command
失败,cd -
将不会执行。
从当前目录提供执行命令的脚本目录的完整路径
/root/server/user/home/bin/script.sh
su
可以在运行任何-c
命令之前将工作目录重置为您指定的用户的主目录。这对我很有帮助。