上記で定義したとしても、スクリプト内でエイリアスを使用することはできません。

上記で定義したとしても、スクリプト内でエイリアスを使用することはできません。

非常に奇妙なケースがあります... /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で は、 関数も呼び出されるため、シェルが無限再帰に入るのを防ぎます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には次のような記述がある

ほとんどすべての目的において、エイリアスはシェル関数に置き換えられます。

答え2

bashスクリプト内でaliasのような対話型機能を使用するには、対話型bashシェルで実行する必要があります。そのためには、最初の行に . を含めるように変更します-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'

запретить

関連情報