Bash

不能在腳本中使用別名,即使我在上面定義了它!

  • April 15, 2020

我有一個非常奇怪的情況…如果我使用 /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 函式所取代。

引用自:https://unix.stackexchange.com/questions/368246