web-dev-qa-db-ja.com

`cd`はどこにありますか?

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
36
spuder

どのCDを使用していますか?

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

CDがハッシュ化されないのはなぜですか?

ハッシュは、ビルトインやキーワードではなく、ファイルの場所を「ハッシュ」(別名:キーと値のペアで「保存」)することのみを目的としています。 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

/ bin/cdとは何ですか?

私のFedora 19システムでは、/bin/cdは実際にはシェルスクリプトです。

$ more /bin/cd
#!/bin/sh
builtin cd "$@"

しかし、それはあなたが思っていることをしません。詳細については、これらの他のU&L Q&Aを参照してください。

結論:

POSIXはそれが存在することを要求し、この実装では、それはテストとして機能し、ディレクトリをXに変更できることを確認しますが、これが可能であることを確認または拒否する戻りコードを返します。

47
slm

組み込みです。見る man bashの詳細についてはcdを、組み込みの説明については Bashマニュアル を参照してください。

組み込みコマンドはシェル自体に含まれています。組み込みコマンドの名前が単純コマンドの最初の単語として使用されている場合(単純コマンドを参照)、シェルは別のプログラムを呼び出さずにコマンドを直接実行します。組み込みコマンドは、別個のユーティリティで取得することが不可能または不便な機能を実装するために必要です。
16
jasonwryan

typewhereisはそれを表示できます。

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メインプログラムにあり、ディスクの他の場所にある別のプログラムではないことを意味します。

3
Michael Durrant

DOSの内部コマンドと外部コマンドのように。単純なコマンドがシェルに実装されています(最も一般的にはcommand.com)。より複雑で使用頻度の低いコマンドは、個別の実行可能ファイルに実装され、コマンドインタープリターの複雑さとメモリ消費を削減します。これらは外部コマンドになります。

1
phuclv

cdは、シェルなどの組み込み関数です。 bash、csh、ksh。

シェルがサポートする多くの組み込み関数があります。man bashコマンドを使用してそれらを確認できます。

1
OmPS

cdは、他の人がすでに述べたように、シェル組み込み関数です。

_$ type cd
cd is a Shell builtin
_

これは、プロセスがptrace()(たとえばgdbが使用する)を使用しないと別のプロセスの作業ディレクトリを変更できないためです。それは不必要なオーバーヘッドになります。さらに、Ubuntuなどの一部のディストリビューションではその使用が制限されています。

0
nyuszika7h