从任何地方运行程序而无需更改目录

The*_*man 9 command-line alias

我希望创建一个运行程序 x 的别名,而不更改我所在的当前目录。我现在拥有的是:

alias x = "cd /home/path_to_x && ./x"
Run Code Online (Sandbox Code Playgroud)

这有效,但更改了我的目录。我想做的是:

alias x="./home/path_to_x/x
Run Code Online (Sandbox Code Playgroud)

但是后来我没有得到这样的文件或目录。有人知道解决方法吗?

Use*_*ess 14

不要 CD,只需使用其绝对路径运行它

这个版本:

cd /home/path_to_x && ./x
Run Code Online (Sandbox Code Playgroud)

将目录更改为绝对路径(您会看到如何/home/...从根目录开始),然后在相对路径./x(即相对于新工作目录)运行可执行文件。

这个版本:

./home/path_to_x/x
Run Code Online (Sandbox Code Playgroud)

尝试在相对路径运行可执行文件./home/path_to_x/x,这意味着相对于您当前的工作目录现在是什么。这就解释了为什么会出现错误 - 这个相对路径确实不存在。

你想要的命令是:

/home/path_to_x/x
Run Code Online (Sandbox Code Playgroud)

/再次使用绝对路径(从根目录开始)。

哦,你也可以只添加/home/path_to_x到你的PATH而不是创建别名。请参阅:如何在不键入完整路径的情况下运行脚本?


Rma*_*ano 8

如果您不希望在cd别名替换后保持不变,请使用带有(y的子shell )

alias my_x="(cd /home/path_to_x && ./x)&" 
Run Code Online (Sandbox Code Playgroud)

你可以检查它

alias test_y="(cd /tmp && sleep 10 ) & "
Run Code Online (Sandbox Code Playgroud)

注意解决方法

alias my_y="/home/path_to_x/x" 
Run Code Online (Sandbox Code Playgroud)

不完全等效。事实上,如果通过 via 调用my_xx程序会在当前目录下运行/home/path_to_x/,而如果被调用my_yx则在当前目录下运行,该目录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
Run Code Online (Sandbox Code Playgroud)

但不在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] % 
Run Code Online (Sandbox Code Playgroud)

bash 和 zsh似乎 以不同的方式执行列表......所以最好添加显式括号......感谢@EliahKagan 将它指向我。