11

~/.bash_aliasesリモート ubuntu サーバー上のファイルにエイリアスがあります。~/.bashrcファイルは、次のようにファイルから標準的な方法でロードされます。

if [ -f ~/.bash_aliases ]; then
    . ~/.bash_aliases
fi

そのファイルは、次のようなファイル~/.bashrcから(これも標準的な方法で)ロードされます。~/.profile

if [ "$BASH" ]; then
  if [ -f ~/.bashrc ]; then
    source ~/.bashrc
    echo ".profile loaded .bashrc"
  fi
fi
mesg n

ファブリック コマンドでエイリアスを使用できないことがわかりました。たとえば、ファブリック スクリプトでこれを実行すると、次のようになります。

run("aliased_command")

私はこの出力を得ます:

run: aliased_command
out: .profile loaded .bashrc
out: /bin/bash: aliased_command: command not found
Fatal error: run() encountered an error (return code 127) while executing 'aliased_command'

これで、ssh を使用してサーバーにログインし、以下を実行することで、ファブリックの外部でこれを再現することができました。

~# /bin/bash -l -c aliased_command 

シェルから (nb/bin/bash -l -cはファブリックのデフォルトです。こちらを参照してください)、同じ出力が得られます。

.profile loaded .bashrc:
/bin/bash: aliased_command: command not found

関連トピックをかなり検索した後、非対話型シェルではエイリアスがエクスポートされないことをどこかで読んだので、/bin/bash -l -c -i( -ibash を対話型モードに設定します) を使用してこれを修正することができました。

次に、fabfile.py に以下を追加しました。

env.shell = "/bin/bash -l -c -i" 

これで、fabric コマンドでエイリアスを使用できるようになりました...最高です!


だから私の質問は:

  • このソリューションに問題はありますか? もしそうなら、私は何をすべきですか?

  • fabfiles でエイリアスを実行する際に問題を抱えている人はいますか?

  • 私がこの問題を抱えていて、他の人がそうではない明らかな理由はありますか?

  • この問題と解決策を説明するリンクなどを教えてもらえますか? また、彼らがそれらをどのように見つけたかについても説明してください... :)

4

3 に答える 3

25

これが主な問題に対する簡単な答えです。私の長い質問を読んでいる人を救うために、追加するだけです

env.shell = "/bin/bash -l -i -c" 

fabfile.py に追加すると、ファブリック コマンドでエイリアスを使用できるようになります。

于 2012-06-30T07:51:57.763 に答える
5

はい、デフォルトでは、非対話型セッションで bash シェルによってエイリアスが展開されないことは完全に正しいです。

man ページのエイリアスに関するセクションを参照してください: http://linux.die.net/man/1/bash

シェルが対話型でない場合、expand_aliases シェル オプションが shopt を使用して設定されていない限り、エイリアスは展開されません (以下のシェルの組み込みコマンドの shopt の説明を参照してください)。

したがって、これを非インタラクティブ セッションで実行できるようにするには、これを.profile.

shopt -s expand_aliases

これにより、インタラクティブ セッションに頼ることなく、非インタラクティブ セッションとファブリック スクリプトでエイリアスを使用できるようになります。

于 2012-06-30T07:58:54.607 に答える
2

エイリアスをエクスポートしないという bash の動作の背後にある理由は、エイリアスは主に、インタラクティブなシェル ユーザーがクイック ショートカットや省略形を定義するためのメカニズムを提供するように設計されているためだと思います。ls -lスクリプトでは、読みやすくするために完全なコマンドを (つまりの代わりに)使用する必要がありますll。プロジェクトのソースを読むために、人々にすべてのエイリアスを教えさせないでください。エイリアスが非常に重要な場合は、スタンドアロンのシェル スクリプトまたは少なくともシェル関数を作成することを検討してください。非対話的なソース コードでエイリアスを使用することは非常にまれであることがわかると思います。おそらく、実装を再検討する必要があります。

于 2012-07-09T13:45:02.237 に答える