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

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

非常に奇妙な状況が発生しました... / 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次の内容が含まれています。

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

おすすめ記事