我希望创建一个别名,运行程序 x,而不改变我当前所在的目录。我现在拥有的是:
alias x = "cd /home/path_to_x && ./x"
这有效,但会更改我的目录。我希望执行的操作如下:
alias x="./home/path_to_x/x
但我没有得到这样的文件或目录。有人知道解决这个问题的办法吗?
答案1
不要使用 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
,而不是创建别名。参见:如何在不输入完整路径的情况下运行脚本?
答案2
如果你不想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"
并不完全等同。事实上,如果通过 调用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 向我指出这一点。
答案3
如果您要运行的文件已经可执行,为什么不将其添加到 PATH 变量中?
如果你的可执行文件/home/user/aplication/appX
只是输入
PATH=$PATH:/home/user/application
至您的~/.bashrc
或~/.profile
重新启动控制台后,你可以简单地运行它appX
我认为这是最干净的解决方案。
答案4
获取当前密码的备份,并在运行命令后撤消上一个密码。
alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'