使用别名与nohup

19
为什么以下代码不起作用?
$ 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别名(alias)到不同的二进制文件,以便用于我的自定义目的;但是,如果我不提供完整路径给perl/python二进制文件,则nohup会给我带来麻烦。


尝试运行 eval nohup sayHello(虽然我觉得它不会成功)。祝你好运。 - shellter
2
把nohup命令放到别名里怎么样:alias sayHello='nohup /bin/echo "你好,世界"' - orb
4个回答

12

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

$ alias sayHello='/bin/echo "Hello world!"'

现在在这个 shell 进程中已知一个别名,这很好,但只能在此 shell 进程中使用。

$ sayHello 

Hello world!

因为您在同一个 shell 中使用了 "sayHello",所以它才能正常工作。

$ nohup sayHello

这里启动了一个名为“nohup”的程序作为子进程,因此它将不会接收到别名(aliases)。 然后它启动了子进程“sayHello” - 但是该进程未找到。

针对你的具体问题,最好让新的“perl”和“python”尽可能地看起来像普通的程序。我建议设置搜索路径。

在你的~/.bash_profile中添加以下内容:

export PATH="/my/shiny/interpreters/bin:${PATH}"

然后重新登录。

由于这是一个环境变量,它将传递给所有子进程,无论它们是否是shell,它应该经常工作。


因此,它不会接收到别名。我在想,子进程,比如 (echo "TheAlias=$(alias sayHello;sayHello)")&wait 会失败,似乎别名没有被应用但却存在;我想知道是否有一些方法可以应用已经存在的别名? - Aquarius Power

7

对于bash:尝试执行nohup '你的别名'。这对我有效。我不知道为什么反引号没有显示出来。将你的别名放在反引号中。


5
使用bash,您可以使用-i选项交互式地调用子shell。这将源化您的.bashrc并启用expand_aliases shell选项。当然,这仅在您的.bashrc中定义了alias时才有效,这是惯例。 Bash manpage:

如果存在-i选项,则shell为交互式

expand_aliases:如果设置,则会像ALIASES下面所描述的那样扩展别名。对于交互式shell,默认情况下启用此选项。

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


$ nohup bash -ci 'sayHello'

这个答案适用于更一般的情况,并且应该适用于所有别名。 - Delta._.43

0

如果您查看Bash手册的别名部分,它会说

每个简单命令的第一个单词(如果未引用)将被检查以查看它是否具有别名。

不幸的是,似乎bash没有像zsh全局别名一样的东西,可以在任何位置展开。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接