【问题标题】:Using aliases with nohup在 nohup 中使用别名
【发布时间】:2012-03-07 06:36:56
【问题描述】:

为什么以下操作不起作用?

$ 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 二进制文件的完整路径)

【问题讨论】:

  • 试试eval nohup sayHello(如果它有效,我会感到惊讶)。祝你好运。
  • 把nohup命令放在别名里怎么样:alias sayHello='nohup /bin/echo "Hello world"'

标签: bash unix alias nohup


【解决方案1】:

因为 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 - 它现在应该经常工作。

【讨论】:

  • "因此,它不会接收别名。"我在想,子进程,如(echo "TheAlias=$(alias sayHello;sayHello)")&wait 失败,似乎没有应用别名但存在;我想知道是否有办法应用确实存在的别名?
【解决方案2】:

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

每个简单命令的第一个单词,如果没有被引用,就会被检查以查看 如果它有别名。

不幸的是,bash 似乎没有像 zshglobal aliases 这样的东西,它们可以在任何位置展开。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      Bash 手册页:

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

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

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


      $ nohup bash -ci 'sayHello'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-13
        • 2016-12-11
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        • 2019-06-21
        相关资源
        最近更新 更多