Ant*_*yko 327 linux shell environment
使用Linux shell,如何从当前工作目录启动具有不同工作目录的程序?
例如,我有一个二进制文件helloworld,hello-world.txt在当前目录中创建该文件.该文件位于目录中/a.目前我在目录中/b.我想启动我的程序运行../a/helloworld并hello-world.txt在第三个目录中的某个位置/c.
Dav*_*itt 526
像这样调用程序:
(cd /c; /a/helloworld)
Run Code Online (Sandbox Code Playgroud)
括号会导致生成子shell.然后,此子shell将其工作目录更改为/c,然后helloworld从中执行/a.程序退出后,子shell终止,返回到您启动的目录中的父shell的提示符.
错误处理:为了避免在没有更改目录的情况下运行程序,例如在拼写错误时/c,执行helloworld条件:
(cd /c && /a/helloworld)
Run Code Online (Sandbox Code Playgroud)
减少内存使用:为了避免在hello world执行时使子shell浪费内存,请helloworld通过exec 调用:
(cd /c && exec /a/helloworld)
Run Code Online (Sandbox Code Playgroud)
[感谢Josh和Juliano给出了改进这个答案的提示!]
Jul*_*ano 92
类似于David Schmitt的回答,加上Josh的建议,但不会让shell进程运行:
(cd /c && exec /a/helloworld)
Run Code Online (Sandbox Code Playgroud)
这种方式更类似于您通常在shell上运行命令的方式.要查看实际差异,您必须ps ef使用每个解决方案从另一个shell 运行.
Lor*_*ren 22
一个不需要子shell并且内置于bash的选项
(pushd SOME_PATH && run_stuff; popd)
Run Code Online (Sandbox Code Playgroud)
演示:
$ pwd
/home/abhijit
$ pushd /tmp # directory changed
$ pwd
/tmp
$ popd
$ pwd
/home/abhijit
Run Code Online (Sandbox Code Playgroud)
mih*_*ihi 18
sh -c 'cd /c && ../a/helloworld'
Run Code Online (Sandbox Code Playgroud)
小智 11
我一直认为UNIX工具应该写成过滤器,从stdin读取输入并将输出写入stdout.如果可能,您可以更改helloworld二进制文件以将文本文件的内容写入stdout而不是特定文件.这样你就可以使用shell在任何地方写你的文件.
$ cd~/b
$〜/ a/helloworld>〜/ c/helloworld.txt
小智 8
只需将最后一个"&&"更改为";" 无论命令失败还是成功,它都会回来:
cd SOME_PATH && run_some_command ; cd -
Run Code Online (Sandbox Code Playgroud)
小智 6
为什么不保持简单呢
cd SOME_PATH && run_some_command && cd -
最后一个“cd”命令将带您返回到最后一个 pwd 目录。这应该适用于所有 *nix 系统。