web-dev-qa-db-ja.com

上で定義しても、スクリプトでエイリアスを使用できません!

非常に奇妙なケースがあります.../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のバグですか?それとも私が見逃しているものはありますか?

どんな助けでもありがたいです!

8
nichen

スクリプトでseエイリアスを使用しないでください。スクリプトでインタラクティブに使用するために設計された機能を使用することはほとんど意味がありません。代わりに、関数を使用します。

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マニュアルには次のステートメントが含まれています

ほとんどすべての目的で、エイリアスはシェル関数に取って代わられました。

12
Kusalananda

Bashスクリプト内でエイリアスのようなインタラクティブ機能を使用するには、インタラクティブbashシェルでそれを実行する必要があります。そのためには、最初の行を変更して-iを含めます。したがって、新しいスクリプトファイルは

#!/bin/bash -i
alias somecommand='ls -alF'
alias
somecommand 
9
amisax

前の質問 の複製のようなものですが、答えは冗長です。簡単に言えば、オカルト上の理由から、デフォルトではbashはスクリプト内で定義されたエイリアスを調べません。上記のスクリプトの上部にあるshopt -s expand_aliases行を使用して、そうするように明示的に指示する必要があります。それを行うと、スクリプトが見つかります いくつかのコマンド

3
Nadreck

最初の行の後にshopt -s expand_aliasesを追加するだけです

#!/bin/bash
shopt -s expand_aliases
alias somecommand='ls -alF'
alias
somecommand

これは出力されます

$ /tmp/alias.sh 
alias somecommand='ls -alF'
total 111044
drwxr-xr-x  4 sobi3ch sobi3ch     4096 Aug 22 14:27 ./
drwxr-xr-x 31 sobi3ch sobi3ch     4096 Aug 23 10:19 ../

デフォルトのエイリアスはインタラクティブシェルのみです(man bashから)

expand_aliases

設定されている場合、エイリアスは上記の「エイリアス」で説明したように展開されます。このオプションは、対話型シェルではデフォルトで有効になっています。

1
sobi3ch

新しいシェルとして実行する代わりにyour_scriptをソースし、スクリプトとエイリアスをソースするだけで受け入れられます

0
user406258

使用する 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'

запретить
0