「どれ」が組み込み命令ですか?これを無視できますか?

「どれ」が組み込み命令ですか?これを無視できますか?

openSUSEでは、「which」コマンドは実際には更新され、別のアプリケーションである可能性が高くなりますが、他のディストリビューションでは組み込みコマンドです。

もしそうなら、PATHに "which"コマンドがある場合、デフォルトの組み込みコマンドは無視されますか?

これはcdコマンドや他の組み込みコマンドに適用されますか?

メモ:https://software.opensuse.org/package/which

答え1

質問がたくさんあります。答えてみましょう:

「どれ」が組み込み命令ですか?

はい

  • 一部のシェル(csh、tcsh、zsh)に組み込まれたコマンド
  • (lksh、mksh、ksh93、attsh) のエイリアストレース (ハッシュされたtype whichコマンドに対してシェルが印刷する内容 (詳細))hash
  • (dash、bash、yash)の外部アプリケーション。

したがって、普遍的に簡単な答えはありません。

これを無視できますか?

実行順序は、常にエイリアス、特殊な組み込み関数(およびPATHから取得した後)、一般的な組み込み関数、および外部ユーティリティです。

書く:

  • 特殊な組み込み関数はエイリアスを使用します。
  • 一般的な組み込み機能はエイリアスまたは関数を使用します。
  • PATHを使用している場合は、いつでも他の実行可能ファイルの前に実行可能ファイルを追加できます。
  • また、一部のシェルは、パス検索で(%builtin)などの追加の組み込みコントロールを提供することがあります。Minix I (1989) グレーシェルまたはksh、bash、zshで有効/無効

openSUSEでは、「which」コマンドは別のアプリケーションですか?

はい、Fedora、Debian、その他多くのシステムでも同様です。しかし、この点において、貝殻は特別な発言権を持っているかもしれません。

他のディストリビューションに組み込まれたコマンドですか?

使用可能なファイルを決定するディストリビューションよりも使用するシェルに依存しています。ディストリビューションはファイルを選択し、シェルは組み込みファイルを選択します。

パスの「which」コマンドはデフォルトの組み込みコマンドをオーバーライドしますか?

いいえ。アプリケーションは、検索順序で実行される最後の要素であるためです。

これはcdコマンドや他の組み込みコマンドにも当てはまりますか?

Acd定期的な組み込みのため、エイリアスまたは関数でオーバーライドできます(Posixの用語では:パスに同じ名前の実行可能ファイルがある場合のみ)。

答え2

whichzshには組み込まれていますが、他のほとんどのシェルには組み込まれていません。 zshとInvokeを使用すると、組み込みwhichシェルが使用されます。これは、コマンドと組み込みシェルが同じ名前を共有したときに表示される一般的な動作です。

このコマンドを呼び出そうとすると、POSIXはcommandこれを実行するための組み込みコマンドを提供しますcommand which。コマンドがどこにあるかを知りたい場合は、POSIXメソッドを使用してくださいcommand -v

答え3

以下を使用すると簡単に見つけることができますwhich

Fedora 32から:

$ which which
alias which='(alias; declare -f) | /usr/bin/which --tty-only --read-alias --read-functions --show-tilde --show-dot'
    /usr/bin/which

$ rpm -qf /usr/bin/which
which-2.21-19.fc32.x86_64

したがって、別のコマンドです。

答え4

$ help
 alias [-p] [name[=value] ... ]          logout [n]
 bg [job_spec ...]                       mapfile [-d delim] [-n count] [-O or>
 bind [-lpsvPSVX] [-m keymap] [-f file>  popd [-n] [+N | -N]
 break [n]                               printf [-v var] format [arguments]
 builtin [shell-builtin [arg ...]]       pushd [-n] [+N | -N | dir]
 caller [expr]                           pwd [-LP]
 case WORD in [PATTERN [| PATTERN]...)>  read [-ers] [-a array] [-d delim] [->
 cd [-L|[-P [-e]] [-@]] [dir]            readarray [-d delim] [-n count] [-O >
 command [-pVv] command [arg ...]        readonly [-aAf] [name[=value] ...] o>
 compgen [-abcdefgjksuv] [-o option] [>  return [n]
 complete [-abcdefgjksuv] [-pr] [-DEI]>  select NAME [in WORDS ... ;] do COMM>
 compopt [-o|+o option] [-DEI] [name .>  set [-abefhkmnptuvxBCHP] [-o option->
 continue [n]                            shift [n]
 coproc [NAME] command [redirections]    shopt [-pqsu] [-o] [optname ...]
 declare [-aAfFgilnrtux] [-p] [name[=v>  source filename [arguments]
 dirs [-clpv] [+N] [-N]                  suspend [-f]
 disown [-h] [-ar] [jobspec ... | pid >  test [expr]
 echo [-neE] [arg ...]                   time [-p] pipeline
 enable [-a] [-dnps] [-f filename] [na>  times
 eval [arg ...]                          trap [-lp] [[arg] signal_spec ...]
 exec [-cl] [-a name] [command [argume>  true
 exit [n]                                type [-afptP] name [name ...]
 export [-fn] [name[=value] ...] or ex>  typeset [-aAfFgilnrtux] [-p] name[=v>
 false                                   ulimit [-SHabcdefiklmnpqrstuvxPT] [l>
 fc [-e ename] [-lnr] [first] [last] o>  umask [-p] [-S] [mode]
 fg [job_spec]                           unalias [-a] name [name ...]
 for NAME [in WORDS ... ] ; do COMMAND>  unset [-f] [-v] [-n] [name ...]
 for (( exp1; exp2; exp3 )); do COMMAN>  until COMMANDS; do COMMANDS; done
 function name { COMMANDS ; } or name >  variables - Names and meanings of so>
 getopts optstring name [arg]            wait [-fn] [id ...]
 hash [-lr] [-p pathname] [-dt] [name >  while COMMANDS; do COMMANDS; done
 help [-dms] [pattern ...]               { COMMANDS ; }
root@machinexa:~# help | grep which
root@machinexa:~# 

bashの組み込み機能ではないものは何ですか?間違っていたらコメントを教えてください。また、パスを表示するには、/ usr / binなどの各パスがすべてのパスに置き換えられていることをenv $PATH確認することもできます。ls /usr/bin/which

関連情報