Bashサブシェルで、cdを実行すると次のエラーが発生します
Sudo: cd: command not found
パスがないので、これは予想通りです。通常、これを回避するには、次のようにフルパスを指定します:(/ usr/local/bin/foo)
驚いたことに、cd
は通常の場所にはないようです。
which cd
whereis cd
ls /bin | grep cd
比較すると、ls
は私が期待するところです。
which ls
/bin/ls
cd
コマンドはどこにありますか?そして、なぜ他のすべてのコマンドと異なるのですか?
更新
別の興味深い一口、cdはhash
に表示されません
hash
0 /bin/ls
2 /usr/bin/find
2 /sbin/ip
1 /usr/bin/updatedb
1 /usr/bin/apt-get
Bashを使用している場合、cd
は組み込みです。 typeコマンドはこれを裏付けます:
$ type -a cd
cd is a Shell builtin
cd is /usr/bin/cd
cd is /bin/cd
システムはこのリストの最初のものを使用するため、組み込みオプションが優先され、動作する唯一のオプションになります(のセクションを参照してください)/ bin/cd)。
ビルトインは、Bashがそれ自体を行う方法を知っている関数と考えるのが好きです。基本的に、頻繁に使用するものはすべてBashの「カーネル」に移動されるため、毎回プロセスを実行する必要はありません。
次のようにbuiltin
コマンドを使用すると、組み込みを希望することをいつでも明示的にBashに伝えることができます。
$ builtin cd
builtin
に関するヘルプを参照してください。
$ help builtin
ハッシュは、ビルトインやキーワードではなく、ファイルの場所を「ハッシュ」(別名:キーと値のペアで「保存」)することのみを目的としています。 hash
の主なタスクは、頻繁に使用される実行可能ファイルを探すたびに$PATH
を通過する必要をなくすことです。
これらは通常、Bashのプログラミング言語機能の一部であるコマンドです。
$ type while
while is a Shell keyword
$ type for
for is a Shell keyword
$ type !
! is a Shell keyword
[
など、いくつかの方法は複数の方法で実装されます。
$ type -a [
[ is a Shell builtin
[ is /usr/bin/[
[ is /bin/[
...そしてあなたが発見したcd
。
私のFedora 19システムでは、/bin/cd
は実際にはシェルスクリプトです。
$ more /bin/cd
#!/bin/sh
builtin cd "$@"
しかし、それはあなたが思っていることをしません。詳細については、これらの他のU&L Q&Aを参照してください。
結論:
POSIXはそれが存在することを要求し、この実装では、それはテストとして機能し、ディレクトリをXに変更できることを確認しますが、これが可能であることを確認または拒否する戻りコードを返します。
組み込みです。見る man bash
の詳細についてはcd
を、組み込みの説明については Bashマニュアル を参照してください。
組み込みコマンドはシェル自体に含まれています。組み込みコマンドの名前が単純コマンドの最初の単語として使用されている場合(単純コマンドを参照)、シェルは別のプログラムを呼び出さずにコマンドを直接実行します。組み込みコマンドは、別個のユーティリティで取得することが不可能または不便な機能を実装するために必要です。
type
とwhereis
はそれを表示できます。
Grepの場合:
$ type grep
grep is /bin/grep
Chownの場合:
$ whereis chown
chown: /bin/chown /usr/share/man/man2/chown.2.gz /usr/share/man/man1/chown.1.gz
locate
は、ワイルドカード検索に基づいて関連ファイルを表示する場合にも役立ちます。 chownコマンドの場合:
$ locate chown
/bin/chown
/home/durrantm/.rvm/gems/Ruby-1.9.3-p194/doc/rubyzip-0.9.8/ri/Zip/ZipFileSystem/ZipFsFile/chown-i.ri
/usr/lib/pt_chown
/usr/share/man/man2/fchown32.2.gz
/usr/share/man/man2/fchownat.2.gz
/usr/share/man/man2/lchown.2.gz
/usr/share/man/man2/lchown32.2.gz
/usr/share/zsh/functions/Completion/Unix/_chown
最後に、結果がコマンドが「ビルド済み」である場合、cd
で見たように、そのコードは実際にはbashメインプログラムにあり、ディスクの他の場所にある別のプログラムではないことを意味します。
DOSの内部コマンドと外部コマンドのように。単純なコマンドがシェルに実装されています(最も一般的にはcommand.com
)。より複雑で使用頻度の低いコマンドは、個別の実行可能ファイルに実装され、コマンドインタープリターの複雑さとメモリ消費を削減します。これらは外部コマンドになります。
cd
は、シェルなどの組み込み関数です。 bash、csh、ksh。
シェルがサポートする多くの組み込み関数があります。man bash
コマンドを使用してそれらを確認できます。
cd
は、他の人がすでに述べたように、シェル組み込み関数です。
_$ type cd
cd is a Shell builtin
_
これは、プロセスがptrace()
(たとえばgdb
が使用する)を使用しないと別のプロセスの作業ディレクトリを変更できないためです。それは不必要なオーバーヘッドになります。さらに、Ubuntuなどの一部のディストリビューションではその使用が制限されています。