13

expand_aliases を bash で有効にすることができません。いろいろ試してみましたが、何もうまくいきません。

簡単なテストケースは次のとおりです。

/bin/bash -c 'shopt -s expand_aliases; alias cdtmp="cd /tmp"; alias; cdtmp; pwd;'

そして出力:

$ /bin/bash -c 'shopt -s expand_aliases; alias cdtmp="cd /tmp"; alias; cdtmp; pwd;'
alias cdtmp='cd /tmp'
/bin/bash: cdtmp: command not found
/home/user

$ /bin/bash --version
GNU bash, version 3.2.25(1)-release (i686-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

(はい、bash に -O オプションの代わりに shopt を使用しています。これは、それが行われていることを証明するためです。)

何か案は?

4

3 に答える 3

14

エイリアスは、それらが定義されている同じ行または同じ関数では使用できません。

Bash の man ページから:

       エイリアスの定義と使用に関する規則は多少異なります。
       紛らわしい。Bash は常に少なくとも 1 行の完全な入力を読み取ります
       その行のコマンドを実行する前に。エイリアスは
       コマンドの実行時ではなく、コマンドの読み取り時に展開されます。したがって、
       別のコマンドと同じ行に表示されるエイリアス定義
       入力の次の行が読み込まれるまで有効になりません。コマンド
       その行のエイリアス定義に従うことは、新しい
       エイリアス。この動作は、関数の実行時にも問題になります。
       エイリアスは、関数定義が読み取られるときに展開されます。
       関数定義自体が com であるため、関数が実行されます。
       ポンド コマンド。結果として、関数で定義されたエイリアスはそうではありません
       その関数が実行されるまで使用できます。いつでも安全に
       エイリアス定義を別の行に置き、comm でエイリアスを使用しないでください。
       ポンド コマンド。

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

Bashリファレンスマニュアルは言う

ほとんどすべての目的で、シェル関数はエイリアスよりも優先されます。

上記の最後の文の代わりに [私のものを強調]。bash -cエイリアスは、スクリプト (ワンライナーのみで構成されるものも含む) で使用する必要があるものではなく、コマンド ラインの利便性であると考えています。

于 2010-03-23T18:11:50.517 に答える
2

10年遅れてやってきました。を使用しevalてエイリアスcdtmpを再度展開できます。

/bin/bash -c 'shopt -s expand_aliases; alias cdtmp="cd /tmp"; alias; eval cdtmp; pwd;'

出力が得られます

alias cdtmp='cd /tmp'
/tmp
于 2020-04-20T23:08:34.500 に答える