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


9

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

alias x = "cd /home/path_to_x && ./x"

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

alias x="./home/path_to_x/x

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


9
设置一个别名,例如alias x='/home/path_to_x/x'.之前不要使用/home.(点)表示当前目录。
souravc 2014年

2
是否x真的需要运行,而在是/home/path_to_x?或者您只是不确定如何运行驻留在特定目录中的程序?
阿达芬2014年


Answers:


13

不要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而不用创建别名。请参阅:如何在不键入完整路径的情况下运行脚本?


这是提出的问题的正确答案。
暂停,直到另行通知。

1
这仅在程序需要在其特定目录中运行时才是不正确的pwd
Kaz Wolfe 2014年

@Waaaaaaat是正确的。/home/path_to_x/x在功能上不等同于(cd /home/path_to_x && ./x); 是否有效取决于应用程序。
Rmano 2014年

尽管您总体上是正确的,但针对此特定问题,OP显然试图从绝对路径运行(只是出现一个字符错误)。但是,我确定他们可以澄清在这种情况下工作目录是否重要。
没用

8

如果您不希望在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_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

但不在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将其指向我。


1
给尾随&更高的优先级&&似乎不是唯一的zsh。我试着sleep 5 && echo done &zshbashkshmkshdash,甚至一个非的Bourne风格的shell( tcsh)。仅在前景中zsh评估sleep 5;所有其他立即返回(然后在done五秒钟后打印出来)。另一方面,即使这完全是的特性zsh,我认为添加显式( )(或{ ;})也很合理,因为它可以将意图传达给其他人(或稍后阅读脚本或历史记录时传达给自己)。
伊利亚·卡根

4

如果要运行的文件已经可以执行,为什么不将其添加到PATH变量中呢?

如果您的可执行文件/home/user/aplication/appX只是输入

PATH=$PATH:/home/user/application

给你~/.bashrc~/.profile

重新启动控制台后,只需使用以下命令即可运行它 appX

我认为这是最干净的解决方案。


3

将a &放在末尾似乎可以解决问题:

alias x = "cd /home/path_to_x && ./x &"

2
你确定吗?执行后,x您进入/home/path_to_x。将&在年底只需发送后台进程。
Rmano 2014年

2
@Rmano这实际上有效。cd后台作业不会影响调用者(这很有意义-如果这样做确实很奇怪)。这是因为异步执行使用subshel​​l。尽管如果它能解释其工作原理,工作原理以及&有时在后台运行的方式有时是不受欢迎的,那么这样做会更好,但这已经(是)正确的答案。(如您建议的那样使用( )语法明确地创建子外壳可能在大多数情况下可能是更好的解决方案。)
Eliah Kagan 2014年

@EliahKagan你是对的。我检查了zsh有效的解决方案,并且有效地在其中使用了它,bash而不是在其中起作用了zsh...别名的扩展方式必须有所不同。
Rmano 2014年


@Rmano没有启用相关设置pushdzsh(我有setopt autopushd pushdsilent pushdtohome,并且它会记住我的CWD)
穆鲁

0

获取当前密码的备份,并在运行命令后撤消上一个密码。

alias x='dwp=$(pwd) && cd /home/path_to_x && ./x && cd $dwp'

您误解了该Rmano别名的效果。命令行未被阻止。只是别名(test)的输出将光标推到了下一行。您仍然可以在该处执行任何操作(包括按Enter以打开新的提示)。
muru

是的,是的。@mure:|
αғsнιη

请注意,由于使用双引号,因此变量在定义别名时将包括当前目录。使用单引号将评估推迟到别名被扩展之前。然而,pushdpopd做你的答案做什么。alias x='pushd /home/path_to_x && ./x && popd'
暂停,直到另行通知。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.