Bash
不能在腳本中使用別名,即使我在上面定義了它!
我有一個非常奇怪的情況…如果我使用 /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 已將somecommand帶入別名,但如果我執行somecommand本身,它仍然無法辨識!
如果我使用命令“sh”來執行腳本,一切都是正確的。這是 bash 的錯誤嗎?還是我缺少什麼?
任何幫助表示讚賞!
只是不要在腳本中使用別名。在腳本中使用為互動式使用而設計的功能沒有什麼意義。相反,使用函式:
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 函式所取代。