我有一個非常奇怪的情況...如果我使用 /bin/bash 運行腳本,它甚至無法識別我在腳本內設定的別名。而最奇怪的是
$ cat -n test.sh
1 #!/bin/bash
2 alias somecommand='ls -alF'
3 alias
4 somecommand
$ ./test.sh
alias somecommand='ls -alF'
./test.sh: line 4: somecommand: command not found
....如上所示,如果我在腳本中運行命令“alias”,結果表明 bash 已採取某個命令進入別名,但如果我運行某個命令本身它仍然不會被識別!
如果我使用命令“sh”運行腳本,一切都是正確的..那麼這是bash的錯誤嗎?還是我缺少什麼?
任何幫助表示讚賞!
答案1
根本不使用腳本中的別名。在腳本中使用專為互動式使用而設計的功能沒有什麼意義。相反,使用函數:
somecommand () {
ls -alF
}
函數比別名靈活得多。以下內容將ls
使用始終執行的版本重載通常的版本ls -F
(參數傳入$@
,包括您使用的任何標誌),幾乎與別名一樣alias ls="ls -F"
:
ls () {
command ls -F "$@"
}
這裡command
可以防止 shell 進入無限遞歸,否則它會這樣做,因為該函數也被稱為ls
。
別名永遠無法做這樣的事情:
select_edit () (
dir=${1:-.}
if [ ! -d "$dir" ]; then
echo 'Not a directory' >&2
return 1
fi
shopt -s dotglob nullglob
set --
for name in "$dir"/*; do
[ -f "$name" ] && set -- "$@" "$name"
done
select file in "$@"; do
"${EDITOR:-vi}" "$file"
break
done
)
這將建立一個函數select_edit
,該函數將目錄作為參數,並要求使用者在該目錄中選擇一個檔案。所選檔案將在編輯器中開啟進行編輯。
手冊bash
包含以下聲明
幾乎所有用途,別名都被 shell 函數取代。
答案2
要在 bash 腳本中使用別名等互動式功能,您必須在互動式 bash shell 中執行它。為此,更改第一行以包含-i
.所以你的新腳本檔變成
#!/bin/bash -i
alias somecommand='ls -alF'
alias
somecommand
答案3
有點重複上一個問題然而那裡的答案有點囉嗦。簡而言之,由於神秘的原因,預設情況下 bash 不會查看腳本內定義的別名。您必須透過shopt -s expand_aliases
所述腳本頂部的一行明確告訴它要這樣做。這樣做然後你的腳本就會發現某個命令。
答案4
shopt -sq expand_aliases
例如,使用UTF-8 編碼的以下代碼:
#!/bin/bash
function запрещать() {
if [ $1 -eq 3 ]
then
echo -n "Запрещено. Код ошибки: "
echo `expr 2 \* 3 \* 47`
else
echo -n "."
запрещать `expr $1 + 1`
fi
}
#function запретить() {
# запрещать 1
#}
shopt -sq expand_aliases
alias запретить='запрещать 1'
запретить