2015-05-08 59 views
3

裏面工作,我有一個可執行文件command.sh別名沒有一個bash腳本

#/bin/bash 
alias my_command='echo ok' 
my_command 

我的終端是bash的。

當我運行它像./command.sh,它工作正常。

當我像/bin/bash ./command.sh那樣運行它時,它找不到my_command可執行文件。

當我運行它像/bin/sh ./command.sh,它工作正常。

我很困惑。問題在哪裏?

+2

「我的終端是bash。」不,你的* shell *是bash。 –

回答

7

bash手冊頁:

別名沒有擴展的時候shell不是交互,除非expand_aliases外殼選擇是使用shopt設置(參見下shell內建的shopt的 描述下面的命令)。

換句話說,缺省情況下,bash shell腳本中未啓用別名。當您使用bash運行腳本時,它將失敗。

您的sh似乎默認允許在腳本中使用別名。當您使用sh運行腳本時,它會成功。

./command.sh恰好工作,因爲您的朋友格式不正確(您錯過在#!/bin/bash)。

+3

稍後在同一節中:「對於幾乎所有目的而言,shell函數都優於別名。」我從來沒有意識到別名在非交互式shell中沒有擴展。這是避免它們的另一個理由。相對於csh/tcsh別名,Bash別名似乎相當殘廢。另一方面,csh/tcsh沒有函數。 –

+0

實際上,我試圖簡化另一個問題 - 爲什麼我的/etc/bash.bashrc中的別名或〜/ profile沒有被使用。所以功能在這裏不是一個選項。 –

+0

另外,我在執行之前正在執行'shopt -s expand_aliases',甚至在'shopt -s expand_aliases; ......但它仍然沒有得到它。 –

2

別名用於交互式shell,您需要的是一個函數,例如

#!/bin/bash 
function my_command() { 
    echo ok 
} 

my_command