2012-02-15 76 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'