\を使用して関数をエスケープできますか?

\を使用して関数をエスケープできますか?

.bashrcバイパスしたい関数を内で定義しました。

function func() {
   // func
}
export -f func

実行時に邪魔されずにコマンドにenv -i funcアクセスできますが、試しても運がありません。funcfunction"func"\func

\Bash機能をバイパスすることが可能でなければならないという別の記事を読んでください。これは本当ですか?それでは、このような状況で使用できない理由がありますか?

答え1

シェルが関数定義を使用しないようにする正式な方法は、次のように呼び出すことです。

command func

望むより:http://pubs.opengroup.org/onlinepubs/9699919799/utilities/command.html

答え2

たとえば、外部コマンド「func」のパス名を使用できます/usr/bin/func

答え3

関数名にバックスラッシュや他の形式の引用を使用しても効果はありません。シェルの構文解析では、引用符が解析された後、長い間関数を探します。

あなたやあなたが読んだものを書いた人は、混乱した機能とエイリアスです。エイリアスははるかに早く解決され、コマンド名の一部を参照すると、エイリアス検索には適していません。したがって、関数、組み込み、または外部コマンドでなければなりませんが、エイリアスではありません\funcfunc

コマンド名を組み込みコマンドまたは外部コマンドとして強制的に解釈するにはcommand func。コマンド名を外部コマンドとして強制的に解釈するには、を使用しますenv func

答え4

~によるとバッシュ文書

名前

文字、数字、下線のみで構成され、文字または下線で始まる単語です。名前はシェル変数と関数名として使用されます。識別子とも呼ばれます。

言葉

シェルで 1 つの単位として扱われる一連の文字です。単語には引用符のないメタ文字を含めないでください。

関数名を探す使用性格:

コマンド名にスラッシュが含まれていない場合、シェルはスラッシュを見つけようとします。その名前のシェル関数が存在する場合は、次のように呼び出されます。シェル機能

その部分で指摘された引用する(ようにPOSIX):

引用符は、特定の文字または単語の特別な意味をシェルから削除するために使用されます。引用符を使用すると、特殊文字の特殊処理を無効にし、予約語がそのように認識されるのを防ぎ、パラメータ拡張を防ぐことができます。

POSIXと同様に、bashは参照とエイリアスに言及しますが、特に言及しません。機能引用について。

要約すると、関数名を参照する機能は文書化されていません。外部コマンドを使用するには、スラッシュを使用するのが最善です。バッシュとPOSIXこれに同意します。

単純なコマンドがコマンド名とオプションの引数のリストを生成する場合は、次のことを行う必要があります。

  1. コマンド名に<slash>文字が含まれていない場合、最初の成功したステップは次の順序で実行する必要があります。

文書を読むのに役立ちます。

関連情報