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

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

我有一個非常奇怪的情況...如果我使用 /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'

запретить

相關內容