为什么以下不起作用?
$ alias sayHello='/bin/echo "Hello world!"'
$ sayHello
Hello world!
$ nohup sayHello
nohup: appending output to `nohup.out'
nohup: cannot run command `sayHello': No such file or directory
(我问这个问题的原因是因为我将perl
和python
别名到不同的perl / python二进制文件中,这些二进制文件是为了我自己的目的而优化的;但是,nohup给了我麻烦,如果我不提供我的perl / python二进制文件的完整路径)
答案 0 :(得分:9)
因为shell没有将别名传递给子进程(除非你使用$()或``)。
$ alias sayHello ='/ bin / echo“Hello world!”'
现在在这个shell进程中已知一个别名,这很好但只适用于这个shell进程。
$ sayHello
Hello world!
既然你在同一个shell中说“sayHello”就行了。
$ nohup sayHello
这里,程序“nohup”正在作为子进程启动。因此,它不会收到别名。 然后它启动子进程“sayHello” - 找不到。
对于您的具体问题,最好尽可能使新的“perl”和“python”看起来像普通的那样。我建议设置搜索路径。
在〜/ .bash_profile中添加: export PATH =“/ my / shiny / interpreters / bin:$ {PATH}”
然后重新登录。
由于这是一个环境变量,将传递给所有子进程,无论它们是否为shell - 它现在应该经常工作。
答案 1 :(得分:2)
对于bash:尝试做nohup'your_alias
'。这个对我有用。我不知道为什么回复报价没有显示。将别名放在后引号中。
答案 2 :(得分:1)
使用bash,您可以使用-i
选项以交互方式调用子shell。这将获取您的.bashrc
以及启用expand_aliases
shell选项。当然,只有在您的.bashrc
中定义别名时才会有效。
Bash手册页:
如果存在
-i
选项,则外壳为互动。expand_aliases :如果设置,别名将按照上述ALIASES中的说明进行扩展。对于交互式shell,此选项默认为启用。
当启动不是登录shell的交互式shell时,如果存在这些文件,bash将从
/etc/bash.bashrc
和~/.bashrc
读取并执行命令。
$ nohup bash -ci 'sayHello'
答案 3 :(得分:0)