2012-02-15 34 views
6

为什么以下不工作?nohup使用别名

$ 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 

(我问这个问题的原因是因为我别名我perlpython到了我自己的目的优化的不同的Perl/Python的二进制文件;但是,如果我不提供的nohup让我烦恼我的perl/python二进制文件的完整路径)

+0

尝试'EVAL nohup的sayHello'(我会感到惊讶,如果它的工作原理虽然)。祝你好运。 – shellter 2012-02-15 21:25:05

+1

如何把nohup命令放在别名中: '别名sayHello ='nohup/bin/echo“Hello world”'' – orb 2013-09-29 22:47:36

回答

7

因为shell不会将别名传递给子进程(除非使用$()或``)。

$别名的sayHello =“/斌/回声‘世界,你好!’”

现在的别名是在这个shell进程,这是好的,但仅此一个shell进程的作品闻名。

$ sayHello 

Hello world! 

既然你在同一个shell中说“sayHello”,它就起作用了。

$ nohup sayHello 

这里,程序“nohup”正在作为子进程启动。因此,它不会收到别名。 然后它开始子过程“sayHello” - 找不到。

对于您的具体问题,最好尽可能使新的“perl”和“python”看起来像正常的那样。我建议设置搜索路径。

在你的〜/ .bash_profile中添加: 出口PATH = “/我/有光泽/口译/斌:$ {PATH}”

然后重新登录。

由于这是一个环境变量,它将传递给所有子进程,无论它们是否为shell - 它现在应该经常运行。

+0

谢谢!我感谢它 – asf107 2012-02-15 21:46:50

+0

“因此,它不会收到别名。”我在想,子进程,像'(回声“TheAlias = $(别名sayHello; sayHello)”)&wait'失败,似乎别名不适用,但是存在;我想知道是否可以采用某种方法来应用存在的别名? – 2015-05-28 00:52:08

0

如果你看一下猛砸手册Aliases部分,它说

每个简单命令的第一个字,如果不带引号的,被检查,看 它是否有一个别名。

不幸的是,它似乎并不像bash有一个像zshglobal aliases,这是在任何位置展开任何东西。

2

对于bash:尝试做nohup'your_alias'。这个对我有用。我不知道为什么没有显示回复报价。把你的别名放在引号内。

1

使用bash,可以使用-i选项以交互方式调用子shell。这将源自您的.bashrc以及启用expand_aliases shell选项。当然,这只适用于你的别名在你的.bashrc这是惯例中定义的。

猛砸手册页:

如果-i选项存在,外壳是互动

expand_aliases:如果设置了别名,则按照上面在ALIASES下所述进行扩展。此选项为,默认情况下为交互式shell启用

当不是登录shell的交互式shell启动时,如果这些文件存在,bash将从/etc/bash.bashrc~/.bashrc中读取并执行命令。


$ nohup bash -ci 'sayHello'