16

为什么以下不起作用?

$ 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 二进制文件起了别名;但是,如果我不提供我的 perl/python 二进制文件的完整路径,nohup 会给我带来麻烦)

4

4 回答 4

11

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

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

现在在这个 shell 进程中知道了一个别名,这很好,但只在这个 shell 进程中有效。

$ sayHello 

Hello world!

由于您在同一个外壳中说“sayHello”,所以它起作用了。

$ nohup sayHello

这里,程序“nohup”作为子进程启动。因此,它不会收到别名。然后它启动子进程“sayHello”——没有找到。

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

在你~/.bash_profile添加

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

然后重新登录。

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

于 2012-02-15T21:35:07.193 回答
6

对于 bash:尝试执行 nohup ' your_alias'。这个对我有用。我不知道为什么没有显示反引号。将您的别名放在反引号内。

于 2015-11-02T16:17:47.580 回答
1

-i使用 bash,您可以使用该选项以交互方式调用子 shell 。这将获取您.bashrc的资源并启用expand_aliasesshell 选项。当然,这仅在您的别名定义在您.bashrc的约定中时才有效。

Bash 联机帮助页:

如果-i存在该选项,则 shell 是交互式的。

expand_aliases:如果设置,别名会按照上面 ALIASES 中的描述进行扩展。默认情况下,交互式 shell启用此选项。

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


$ nohup bash -ci 'sayHello'
于 2017-09-24T04:21:58.543 回答
0

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

如果没有引用每个简单命令的第一个单词,则检查它是否有别名。

不幸的是,它似乎没有bashzsh's global aliases这样的东西,它们可以在任何位置展开。

于 2012-02-15T21:35:53.577 回答