Answers:
不要CD,只需使用其绝对路径运行它
这个版本:
cd /home/path_to_x && ./x
将目录更改为绝对路径(您将看到如何/home/...
从根目录开始),然后在相对路径./x
(即相对于新工作目录的相对路径)上运行可执行文件。
这个版本:
./home/path_to_x/x
尝试在相对路径上运行可执行文件./home/path_to_x/x
,这意味着相对于您当前工作目录的相对目录。这就解释了为什么会出现错误-此相对路径确实不存在。
您想要的命令将是:
/home/path_to_x/x
/
再次使用绝对路径(从根目录开始)。
哦,您也可以将其添加/home/path_to_x
到您的文件中,PATH
而不用创建别名。请参阅:如何在不键入完整路径的情况下运行脚本?
pwd
/home/path_to_x/x
在功能上不等同于(cd /home/path_to_x && ./x)
; 是否有效取决于应用程序。
如果您不希望在cd
别名替换后使用,请使用带有(
y 的子shell )
:
alias my_x="(cd /home/path_to_x && ./x)&"
你可以用
alias test_y="(cd /tmp && sleep 10 ) & "
注意解决方案
alias my_y="/home/path_to_x/x"
不完全相同。实际上,如果通过via调用my_x
,则x
程序在当前目录下运行/home/path_to_x/
,而如果通过调用my_y
,x
则在当前目录(即my_y
发出命令的目录)下运行。这可能很重要,也可能不同,这取决于x
正在执行的操作。
关于OP解决方案,它适用于bash
:
romano@RRyS:~$ pwd
/home/romano
romano@RRyS:~$ alias x="cd /bin && ./echo A >/dev/null &"
romano@RRyS:~$ x
[1] 16611
romano@RRyS:~$ pwd
/home/romano
但不在zsh
:
[romano:~] % pwd
/home/romano
[romano:~] % alias x="cd /bin && ./echo A >/dev/null &"
[romano:~] % x
[1] 16744
[1] + 16744 done ./echo A > /dev/null
1& [romano:/bin] % pwd
/bin
[romano:/bin] %
bash和zsh似乎 以不同的方式执行列表 ...所以最好添加显式括号...感谢@EliahKagan将其指向我。
&
更高的优先级&&
似乎不是唯一的zsh
。我试着sleep 5 && echo done &
在zsh
,bash
,ksh
,mksh
,dash
,甚至一个非的Bourne风格的shell( tcsh
)。仅在前景中zsh
评估sleep 5
;所有其他立即返回(然后在done
五秒钟后打印出来)。另一方面,即使这完全是的特性zsh
,我认为添加显式( )
(或{ ;}
)也很合理,因为它可以将意图传达给其他人(或稍后阅读脚本或历史记录时传达给自己)。
将a &
放在末尾似乎可以解决问题:
alias x = "cd /home/path_to_x && ./x &"
x
您进入/home/path_to_x
。将&
在年底只需发送后台进程。
cd
后台作业不会影响调用者(这很有意义-如果这样做确实很奇怪)。这是因为异步执行使用subshell。尽管如果它能解释其工作原理,工作原理以及&
有时在后台运行的方式有时是不受欢迎的,那么这样做会更好,但这已经(是)正确的答案。(如您建议的那样,使用( )
语法明确地创建子外壳可能在大多数情况下可能是更好的解决方案。)
zsh
有效的解决方案,并且有效地在其中使用了它,bash
而不是在其中起作用了zsh
...别名的扩展方式必须有所不同。
pushd
中zsh
(我有setopt autopushd pushdsilent pushdtohome
,并且它会记住我的CWD)
获取当前密码的备份,并在运行命令后撤消上一个密码。
alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'
test
)的输出将光标推到了下一行。您仍然可以在该处执行任何操作(包括按Enter以打开新的提示)。
pushd
和popd
做你的答案做什么。alias x='pushd /home/path_to_x && ./x && popd'
alias x='/home/path_to_x/x'
。.
之前不要使用/home
。.
(点)表示当前目录。