Bashの単語にエイリアス、関数、ファイルなどを強制的に参照させる方法は?


13

関連する質問にもう少し詳細を追加しようとすると、どのBashワードタイプを実行するかを指定する方法がわからないことに気付きました。によるとhelp type、5つの単語タイプがあります:

  • エイリアス
  • キーワード
  • 関数
  • ビルトイン
  • ファイル

単語にはいくつかのタイプがある可能性があります(true単なる例です。より一般的にオーバーライドされる単語はになりますcd)。

$ type -a true
true is a shell builtin
true is /bin/true

特定の同義語の実行をどのように強制しますか?これまでのところ、優先順位の順に:

  • 別名:他のすべての同義語よりも優先されるため、これは特殊なケースです。これを強制することは、エイリアスが定義されていない場合にコマンドが失敗する場合にのみ役立ちます。

    $ 
  • キーワード:

    $ 
  • 関数:

    $ 
  • ビルトイン:

    $ builtin true
  • ファイル:

    $ command true
    $ $(which true)
    $ /bin/true

部分的な解決策

  • 単語を引用すると、エイリアスとキーワードは除外されます。あれは、

    $ 'true'

    関数、組み込み関数、またはファイルのみを実行します。

回答:


10

あなたが求めていることは、あまり意味がありません。

keywordは、それがシェルの構文の一部である単語であることを意味します。それらはトークン化によって認識されます。それらを引用すれば、シェルが認識を停止するのに十分です。

ただし、ほとんどのシェルでキーワードのエイリアスを作成することは可能です。そのため、エイリアスはキーワードよりも優先されます(実際には、それらは早期に展開され、その後、より多くのエイリアス、キーワードを持つことができるトークン化が行われます)...

エイリアス(で定義されたzshエイリアスを除きalias -g、コマンド位置でのみ展開されます)builtin the-alias

関数は組み込みコマンドよりも優先され、組み込みコマンドは外部コマンドよりも優先されます(そして、$PATH使用するコマンドを決定します)。

ビルトインを強制するには:

builtin the-cmd and its args

(ただし、これは標準コマンドではないことに注意してください)。

エイリアスを引用符で囲むことで、エイリアスを無効にできます(ただし、一部のシェルでは引用符付きバージョンをエイリアス化することもできます)。

したがって、たとえば(ここではzsh構文)、次の場所にあります。

'while'() echo function while
alias 'while=echo alias while'

書き込むwhile trueと実際に出力されalias while truewhileキーワードを引用するとエイリアスとキーワードの両方が無効になるため、キーワードを使用する方法はありません。

whileたとえば、次の関数を呼び出します。

'whi'le whatever

whileビルトインが存在する場合(ただし、もちろんwhileキーワードを持つシェルには含まれません)、次のように記述します。

builtin while whatever

whileコマンドを呼び出すには、次のように記述します。

env while whatever

またはzshshエミュレーションではない場合):

command while whatever 

(他のシェルでは、command組み込み関数ではなく関数のみを防止します)

または

/full/path/to/while whatever

もちろん、次のような愚かなことをすることを妨げるものは何もありません。

alias 'while=while "w"hile; do'
"while"() { while "whi"le; done; }

これは、少なくともzshでは有効です(ただし、愚かです)。


引用符はエイリアス検索をcommand 抑制し、関数検索を抑制しますが、どちらも残りの同義語のどれが使用されるかを指定しません。特定のシノニムのみを実行するように指定する方法を探しています。
l0b0

@ l0b0 "command"は、エイリアス、キーワード、組み込みのすべてを抑制します。
ステファンシャゼル

意味を成すbuiltinために、RVMなどで使用しcdて、素晴らしい効果のためにオーバーライドします。
l0b0

あなたが正しい; また、機能を抑制することも確認しました。+1。
l0b0

0

私にとって非常に便利なイディオムは次のとおりです。

FALSE=1; TRUE=0
DEVEL_FLAG=$FALSE
...
in_development() { return $DEVEL_FLAG ; }
cd()
{
 if in_development ; then # -D argument to script toggles development flag
   echo "Would run cd $*"
  else
   builtin cd "$@"
 fi
}

-Dを指定してスクリプトを実行すると、開発モードがアクティブになり、cd(またはその他のラップされたコマンド)がデバッグ情報をエコーし​​ます

これは、sshを実行するスクリプトで特に役立ちます。確かにset -xを切り替えることができますが、これは私にとってより便利で読みやすいです。


1
これは質問にどのように答えますか?
l0b0
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.