コマンドCDは何をしますか?


10

Caps-Lockがオンになっていることに気づかずCDに、Macのコマンドプロンプトに入力しました。驚いたことに、エラーは発生しませんでした。

which CD見せてくれ/usr/bin/CDます。そして、そのファイルを調べると、次のようになります。

#!/bin/sh
# $FreeBSD: src/usr.bin/alias/generic.sh,v 1.2 2005/10/24 22:32:19 cperciva Exp $
# This file is in the public domain.
builtin `echo ${0##*/} | tr \[:upper:] \[:lower:]` ${1+"$@"}

大文字から小文字への翻訳と関係があると思いますが${0##*/}、私には完全に不透明です。 man CD「手動入力なし」と表示されます。誰かがこのコマンドを説明できますか?

編集:OK、OSXのファイルシステムは大文字と小文字を区別しないことに気付いたので、このファイルは実際には/usr/bin/cdです。しかし、cd普通にタイプすれば、もちろんビルトイン/usr/bin/cdを取得するので、ケースを間違えたときにだけ呼び出されます。私はまだそれが何をするのか知りたいです。

回答:


12

それはまったく何もしないようです:

Appleメーリングリストリンク

「私はここでいくつかの古い思い出に行くので、非常に詳細な説明を提供することはできませんが、/ usr / bin / cdが存在する理由は、エイリアスに関連し、エスケープによってエイリアスを使用できないPOSIX要件によるものです。 。ただし、シェルスクリプト内でcdを実行すると、ディレクトリの変更はスクリプトが実行されるサブシェルにのみ適用されるため、/ usr / bin / cdは役に立たないスクリプトです。

また、このスクリプトは、cdだけでなく、多くのコマンドに使用されるという点で汎用スクリプトです。

10.4システムでは、/ usr / bin / cdのハードリンクカウントが15であることに気付きました[...] "

そのスレッドをさらに下に:

「私の友人は、「$ {0 ## * /}」は「コマンドを実行するが、そのパスを削除する」(つまり、「/ usr / bin / cd」を「cd」に変換する)という意味だと言った。

そのため、スクリプトはパスを削除し、結果を小文字に変換してから元の引数を追加するようです。


1

正しいことをして、「cd」コマンドを小文字に変換しようとしています。残念ながら、それはサブシェルで実行されるため、かなり無意味です。残りはbashの理解に関係しています。


そうだとすれば、それは機能しません!たとえば、と入力すると、CD /何も実行されません。
ジョン・フーヒ

1
サブシェルで実行されるためです。/へのCDのサブシェル、そして残し、終了し、あなたのシェルは心を動かされません。
ゴードンデイヴィソン

既に指摘したように、この同じスクリプトにはいくつかの異なるファイル名(ハードリンク)があります-それらのすべてではないにしても、ほとんどは大文字のファイル名です。はい-CDの場合、サブシェルで実行するとcdは効果がないため、動作していないように見えます。だからこそ、正しいことをしようとしているのだと書いたのです。実際、成功しません。一部のケースでは、このスクリプトは正しいことを行います。それはLSにリンクされている場合は、 "LS / USR / BIN"を入力すると、たとえば、それは"lsのは/ usr / binに"を実行します
PBR

また、これらは正規表現ではありません。それらはBashパラメーター展開です:gnu.org/software/bash/manual/…–
ヨハン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.