web-dev-qa-db-ja.com

Bashスクリプトがエイリアスを認識しないのはなぜですか?

私の~/.bashrcファイルには2つの定義があります。

  1. commandA、これは長いパスのエイリアスです
  2. commandB、これはBashスクリプトのエイリアスです

これら2つのコマンドで同じファイルを処理したいので、次のBashスクリプトを作成しました。


#!/bin/bash

for file in "$@"
    do
    commandA $file
    commandB $file
done

セッションからログアウトして再度ログインした後でも、Bashはcommand not foundこのスクリプトを実行すると、両方のコマンドでエラーが発生します。

何が悪いのですか?

237
Zaid

まず第一に、ddeimekeが言ったように、デフォルトではエイリアスは非対話型シェルでは展開されません。

次に、.bashrc環境変数を設定しない限り、BASH_ENVは非インタラクティブシェルによって読み取られません。

しかし、最も重要なことは、それを行わないことです。お願いします?ある日、必要なエイリアスが設定されていない場所にそのスクリプトを移動すると、再び壊れます。

代わりに、スクリプトのショートカットとして環境変数を設定して使用します。

#!/bin/bash

CMDA=/path/to/gizmo
CMDB=/path/to/huzzah.sh

for file in "$@"
do
    $CMDA "$file"
    $CMDB "$file"
done
125
user601

Bashのマンページを見ると、次のことがわかります。

シェルがインタラクティブでない場合、エイリアスは展開されません。ただし、expand_aliasesシェルオプションがshoptを使用して設定されている場合を除きます(下記のシェルの組み込みコマンドの下のshoptの説明を参照してください)。

だから置く

shopt -s expand_aliases

あなたのスクリプトで。

スクリプトでこれを設定した後、必ずエイリアスファイルを入手してください。

shopt -s expand_aliases
source ~/.bash_aliases
175
ddeimeke

エイリアスはエクスポートできないため、定義されていないシェルスクリプトでは使用できません。言い換えると、それらを~/.bashrcで定義した場合、your_script.shを使用できません(スクリプトで~/.bashrcをソースに指定しない限り、お勧めしませんが、実行する方法があります。これは正しく)。

ただし、関数はエクスポートすることができ、関数が定義されている環境から実行されるシェルスクリプトで使用できます。これは、これをbashrcに配置することで実行できます。

 foo()
 {
 echo "Hello World!" 
} 
 export -f foo 

Bashのマニュアルにあるように、「ほとんどすべての目的で、エイリアスよりもシェル関数が優先されます。」

[cmd line] > bash -i [your script's file path]

iはインタラクティブなもので、bashプロファイルを提供します。

11
user65576