私のエイリアスリゾルバはコマンドラインで実行されますが、スクリプト内では実行されません。

私のエイリアスリゾルバはコマンドラインで実行されますが、スクリプト内では実行されません。

-to popdのエイリアスが機能していることを確認しながら、bashの起動時にロードできるファイルにすべてのエイリアスをダンプする簡単なスクリプトを作成しようとしています。

alias -p | sed 's/alias -=/alias -- -=/' > ~/.bash_aliases

コマンドラインから実行するとうまくいくようですが、スクリプトに入れて実行すると(上部#!/bin/bashchmod +x)空のファイルが生成されます。私が逃しているbashの知識が何であるかを教えてくれる人はいますか?

重要な場合は、bash v4.2.10を使用しています。

答え1

シェルスクリプトは呼び出し元プログラムの環境変数などを継承しますが、エイリアスやコマンド履歴などの項目は継承しません。

すべてのエイリアスが共通の場所(たとえば)にある場合は、~/.bashrcまずそのファイルをスクリプトにソースとして配置できます。

. $HOME/.bashrc

その後、シェルスクリプトの実行コンテキストでは、ファイルに定義されているすべてのエイリアスがあります.bashrc

エイリアス定義があちこちにある場合、簡単にマージする方法はありません。 「すべてのエイリアスを保存」を関数として記述する必要があります。たとえば、次のようなものを追加できます~/.bash_profile

function dumpalias {
    alias -p | sed 's/alias -=/alias -- -=/' > ~/.bash_aliases
}

dumpaliasその後、ログアウトしてから再度ログインした後、希望の動作を取得するように指示できます。

答え2

これをスクリプトに入れて実行すると、現在のシェルからエイリアスを継承しない新しいシェルが起動します。だからスクリプトははいシェルエイリアスを保存します。これらのコマンドを実行するシェルにはエイリアスは定義されていません。

あなたはできます源泉現在のシェルでそのスクリプトを実行します。

. /path/to/script

または、次のように書くことができます。シェル機能

関連情報