裏面工作,我有一個可執行文件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
,它工作正常。
我很困惑。問題在哪裏?
裏面工作,我有一個可執行文件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
,它工作正常。
我很困惑。問題在哪裏?
從bash
手冊頁:
別名沒有擴展的時候shell不是交互,除非
expand_aliases
外殼選擇是使用shopt
設置(參見下shell內建的shopt
的 描述下面的命令)。
換句話說,缺省情況下,bash shell腳本中未啓用別名。當您使用bash
運行腳本時,它將失敗。
您的sh
似乎默認允許在腳本中使用別名。當您使用sh
運行腳本時,它會成功。
./command.sh
恰好工作,因爲您的朋友格式不正確(您錯過在#!/bin/bash
)。
稍後在同一節中:「對於幾乎所有目的而言,shell函數都優於別名。」我從來沒有意識到別名在非交互式shell中沒有擴展。這是避免它們的另一個理由。相對於csh/tcsh別名,Bash別名似乎相當殘廢。另一方面,csh/tcsh沒有函數。 –
實際上,我試圖簡化另一個問題 - 爲什麼我的/etc/bash.bashrc中的別名或〜/ profile沒有被使用。所以功能在這裏不是一個選項。 –
另外,我在執行之前正在執行'shopt -s expand_aliases',甚至在'shopt -s expand_aliases; ......但它仍然沒有得到它。 –
別名用於交互式shell,您需要的是一個函數,例如
#!/bin/bash
function my_command() {
echo ok
}
my_command
「我的終端是bash。」不,你的* shell *是bash。 –