cdします。使用していますか?


102

私が従ってきたチュートリアルの1つは、簡単に述べたものであり、役に立たcd .ないものです。シンボリックリンクの再帰で OPによって示された問題を再現しようとすると、何が「リセット」されますか?、私も試してみましたがcd .、これは説明された同じ効果OPを示してい$PWDます(変数を成長させます)cd -P

これは私が不思議に思う、実際に使用したいと思うケースはありますcd . か?


20
ディレクトリを切り替えるときにディレクトリでさまざまなチェックを実行するカスタム.zshrcがあります。たとえば、チェックの1つは、ディレクトリを移動するときに一致するvirtualenvを自動的にアクティブ/非アクティブにすることです。ときどき、新しいシェルなどを起動することがありますが、それらのチェックは実行されません。また、これらのチェックはcd .短くて単純なため、通常はこれらのチェックをトリガーするために使用します。質問の目的はバニラ環境であると思っていたと思いますが。
ライライアン

29
上の(明らかに)効果のほかに$PWDcd .また変化し$OLDPWD、現在のディレクトリに。(現在)なぜこれが役立つのかわかりませんが、完全を期すために…
アンドレアスヴィーゼ

5
cd .以下の答えを見ても、私はこれまで必要としなかったと思いますが、将来的にはそうなるかもしれませんが、後でこのディレクトリに戻るpushd .ことができるようにしたいときに使用しましたpopd。例えばはありませんビルドスクリプトを実行しているときconfigurecd output...およびmake、それに行うのとき、私は元のディレクトリに戻りたいですよ。他の誰もが期待するものとは異なるビルドスクリプトのコピーを自分で維持するのではなく、単にとして実行します。これによりpushd .; ./BuildScriptName.sh; popdpopdときどき、popd後で代わりにすることもできます。
3D1T0R

5
もちろん、「。」および「..」はcdコマンド自体には実装されていないので、その特定の機能を作成しようとする人は誰もいません。実際の目的を果たさないものの組み合わせにすぎません。
デビッドS

1
@ruakhいいえ、外部プログラムはシェル実行環境に影響を与えるべきではありません。これは主にPOSIX準拠のためであり、一部のユーティリティはシェルの外部に存在し、外部コマンドの終了ステータスを評価する必要があります。/bin/cdこちらの目的について読むことができますunix.stackexchange.com/q/50058/85039
Sergiy Kolodyazhnyy

回答:


158

これは問題を考えすぎていると思います。cd .通常の過程で手動で実行するものではないかもしれませんが、それは間違いなくプログラム実行で発生する可能性のcdあるものです)。したがって、特定の用途を持つ必要はありませんcd <some-path>。の通常のセマンティクスを満たす限り、有用です。


12
同意し、 構文で.指定された有効なパスとして適切に処理する必要がありcdます。
セルギー・コロディアズニー

18
次の例を追加できます。whileのようなループIFS= read Dir; do cd "$Dir"; do_something; done < <(find . -type d)。その過程で、findは.パスとして生成されるため、コマンドcd "$Dir"はに展開されcd .ます。したがって、スクリプトでは、完全に便利です。
レックスコギタン

5
たとえば、スクリプトは実際に実行されますcd ${path_to_directory}が、ある時点でディレクトリが現在のディレクトリであることが判明するpath_to_directory = .ためcd .、万が一に備えて作業する必要があります。
デミス

4
言い換えれば、そのユーティリティは、余分なコード(ifチェックとelse句、あらゆる種類の特別な大文字小文字)を不要にするという事実にあります。
jpmc26

2
したがって、x + 0またはx * 1が有用であるという意味で有用です-特定の操作自体は有用ではありませんが、0および1を他の値と同じように扱うことができることを意味します。特別な場合。
user32929

127

ディレクトリのパスは最後のコマンドが実行されてから変更されている可能性がありcd .、bashシェルとksh93シェルがないと、質問にリンクされた投稿で説明されている論理作業ディレクトリに依存するためcd .、シェルを発行する呼び出しはgetcwd()syscallを確実にします現在のパスはまだ有効です。

bashで再現する手順:

  1. ターミナルタブの問題 mkdir ./dir_no_1; cd ./dir_no_1
  2. 別の端末タブの問題 mv dir_no_1 dir_no_2
  3. 最初の端末タブの問題echo $PWDpwd。ディレクトリの名前が外部から変更されていることに注意してください。シェルの環境は更新されていません。
  4. 発行cd .; pwd; echo $PWD。値が更新されたことに注意してください。

ただし、ksh93は環境情報を更新しないためcd .、ksh93では実際には役に立たない場合があります。で/bin/dashUbuntuと他のDebianベースのシステムで、cd .戻りdash: 3: cd: can't cd to .しかし、エラーをcd -P .(は、ksh93とは異なり)働きます。


22
知っておきたいこと:それを役に立たない情報のリストに追加します。^^)
jayooin

12
@jayooin喜んでリストに貢献できた;)
Sergiy Kolodyazhnyy

8
同じ端末/ bash mv ../dir_no_1 ../dir_no_2でできると思います。
ctrl-alt-delor

3
@ ctrl-alt-delor確認済み、動作:)
セルギー・コロディアズニー

1
@ymbirttほとんどのシェルでpwdは、実際にはビルトインですが、呼び出し/bin/pwdはシェルの環境には影響しません。外部ユーティリティは一般にシェル環境に影響しません。理由/bin/cd/bin/pwd存在は、とりわけPOSIX準拠のためのものです。外部cdについての良い議論があり、そのいくつかはおそらく同様に当てはまり/bin/pwdます
Sergiy Kolodyazhnyy

55

別のユースケースはcd .、現在のディレクトリが削除されてから再度作成された場合です。以下を試してみてください-

  1. ディレクトリを作成する temp
  2. cd temp してから ls
  3. 別のターミナルを開き、そのディレクトリを削除してから再作成します temp
  4. 最初の端末から戻って、lsを実行してください。これはエラーになります-ls: cannot open directory .: Stale file handle
  5. cd . そして、lsを行うとうまくいきます

3
これは常に機能するとは限りません。ダッシュでは、たとえば、次のようになります:cd: can't cd to .今、私はそれを見て、これはSergiyの答えですでに言及されています(移動、削除/再作成-基本的に同じ:あなたがいるディレクトリは元のものではなくなったパス)
オロリン

12
私はこれをリモート展開のテストに頻繁に使用します。私が入っているディレクトリは削除され、自動化によって再作成されますcd .。同じ名前の新しいディレクトリに移動するには、発行する必要があります。
HPウィリアムズ

2
cd .現在の作業ディレクトリがsshfsでマウントされたシェルを持っているが、sshセッションが閉じられて再び開かれたときに、いつも使用しています。
ジェームズドリン

4
そのような場合、「cd $ PWD」を実行します。他のバリアントも機能する可能性がありますが、これは明確に意図を表現しています:現在のパスとなるものを抽出し(PWD環境変数の内容を読み取ります)、ファイルシステム階層をルートからたまたまディレクトリに到達します。実際に同じディレクトリであるかどうかにかかわらず、そのパス。これは、この回答のユースケースに正確に適合しています。
ステフェイン・グーリッホン

3
cd .ディレクトリのリンクが解除され、同じファイルシステムパスに新しい別のディレクトリが作成されたときに動作することにも驚いています。現在の作業ディレクトリはリンク解除されており、おそらくその一部として、.or ..エントリがなくなっており、エントリがあったとしても、.エントリはそれ自体を指し続ける必要があります。単に.エントリにアクセスするのではなく、ディレクトリパス名が何であるかに基づいて、シェルまたはカーネルがcdコマンドを実行しているように見えます。誰でもその行動を確認できますか?
エイドリアンプロンク

36

「興味深い」場所を指し示したくない場合がある場合は$OLDPWD、quick cd .でクリアできます。それも影響しcd -ます。


16

プログラム的には、ノーオペレーションとして便利です。外部入力から提供されるパスを検討してください。

read -p "Path to file: " p
dirn=$(dirname "$p")
file=$(basename "$p")
echo "dirn=$dirn, file=$file"
cd "$dirn"
ls -ld "$file"

「fred.txt」などのパスでは、ディレクトリはになり.cd .


1
既に移動先のディレクトリにいる場合はエラーをスローしないのは便利ですが、ノーオペレーションとしては便利だとは言いません。
キャプテンマン

2
すでにディレクトリにいる場合、@ CaptainManがエラーをスローしないことは(事実上)何もしません。このdirnameコマンドは.、パスを分割できると予想されるコードの破損を避けるために必要な場所で生成します。
ロアイマ

15

これは、不良なUSBケーブルで作業する必要がある場合によく発生します。デバイスが切断されて再度接続され、同じディレクトリに自動マウントされた後、デバイスを再度cd .動作させるために使用する必要があります。


1
それは、どのような種類のデバイス、どのようにアクセスされているか、そのファイルシステム、OS、&cに依存しませんか?
1

OS、多分。カーネルが使用中にカーネルをアンマウントする方法を見つけられる限り、ファイルシステムが関連する可能性は低いです。いずれにせよ、コマンドは正確に正しい状況で使用されます。
user23013

11

ご了承ください "。" である(もちろん、シェルプロセスを含む)、および任意のプロセスの現在の作業ディレクトリとして開かれているファイルの名前を指定する適切な方法は、「」は、現在の作業ディレクトリを含む、すべてのディレクトリ内のファイルの有効な名前です。名前は、.たとえば、基本的な現在の作業ディレクトリが削除されている、場合(または「悪い」消え例えば古いNFSハンドル、)プロセスの特定のインスタンスのためのファイルの有効な名前ではないかもしれないが、それは有効な名前ですすべての有効なディレクトリに存在することが保証されているファイルの。

そう. しなければならないディレクトリの名前を受け入れる任意のコマンドの有効な引数で、したがって、標準のシェルでcd .有効なコマンドでなければなりません。

cd .有用かどうかは、シェルの実装に依存します。前述のようにchdir、たとえば、基礎となるディレクトリ(またはその親)の名前が変更された場合など、基礎となるシステムコールを呼び出した後、シェルが現在の作業ディレクトリの絶対パス名の内部概念をリセットすると便利です。

少なくとも私が知っているいくつかのシェル(/bin/shFreeBSDおよびNetBSD)はに変換cd ""されますcd .。これは、変数がパラメーターとして使用される可能性のあるシェルスクリプトでプログラムによる使用をサポートする機能を説明できます(つまり、空の変数置換を「 FreeBSDのコミット履歴では、変更はPOSIXサポートの追加によるもので、失敗を防ぐためにPOSIXサポートを追加したことが直接の原因であると述べていますがchdir("")、POSIXの義務では失敗します。

他のいくつかのシェルは.、現在の作業ディレクトリへの完全修飾パス名として保存されているものに置き換えられます。したがって、これらについては、Sahil Agarwalの回答で述べられている動作が可能になります


4

Gitで作業していたブランチを、同じブランチ上で最初に作成されたディレクトリ内からリベースしたときに、今日このコマンドを使用しました。リベースはうまくいきましたが、その後git statusエラーをスローしました。cd .すべてが正常だった後。

(私はついでにWindows上のMobaXtermで作業していました。これを再現しようとしている場合のために。他のシステムでは発生しないかもしれません。)


また、古いディレクトリを移動して新しいディレクトリに置き換える自動プロセスによって更新されるディレクトリでこのコマンドを使用しました(可能な限りアトミックに近い)。一般的な状況でcd .はありませんが、まさに必要なものです。


Stephane Chazelasからのこの素晴らしい回答を読んだ後:

私が使用していますので、私は今だけの仕事上のこと、私のユースケースを理解しbashている、cd .と等価ですcd "$PWD"。リンクされた回答を読むことを強くお勧めします。


1

関数を使用cd .してオーバーロードcdしたものを再実行するために使用しbashます。

私から~/.bashrc

# from the "xttitle(1)" man page - put info in window title
update_title()
{
    [[ $TERM = xterm ]] || [[ $TERM = xterm-color ]]  && xttitle "[$$] ${USER}@${HOSTNAME}:$PWD"
}

cd()
{
    [[ -z "$*" ]] && builtin cd $HOME
    [[ -n "$*" ]] && builtin cd "$*"
    update_title
}

0

編集:これは以前にSahilによって既に提案されています。

これは、別のプロセスによって削除および再作成されたフォルダー内にいる場合に便利です。たとえば、2つの端末セッション$1$2

$1 mkdir d
$1 cd d
$1 touch f

$2 rm -rf /path/to/d # delete the folder where $1 is in ...
$2 mkdir /path/to/d # ... and recreate it

$1 touch g # cannot create file g because current dir doesn't exist anymore
touch: cannot touch ‘g’: Stale file handle
$1 cd . # go to the newly created dir (same path)
$1 touch g # works fine now

この動作の根本原因が正確にどこにあるのか(OS、SHELL、...?)


これはすでに他の回答で言及されています。
クサラナンダ

-8

いいえ、意味がありません。スクリプトでも、何もしません。


2
シェルに応じて、リセットされ$PWD、ユーザーが独自のcd関数またはエイリアスを提供してビルトインをオーバーロードした場合、他のシェル関数を呼び出す可能性がありますcd。また、現在のディレクトリがまだ有効であり、現在の使用にそこにアクセスする許可があることを確認します。
クサラナンダ

1)もちろん、「cd」の可能なカスタムエイリアスについてではなく、標準ビルドについて話している2)許可がなければ、現在の使用はどのようにあるのか?簡単にするために、私は現実の世界では私の意見でそれを使用する理由はないと言っています。
フェデリコ

1
1)私たちではないですか?2)実世界は単純ではなく、Unixはマルチユーザーオペレーティングシステムです。ユーザーはディレクトリのアクセス許可を変更できます。スクリプトまたは別のユーザーのインタラクティブシェルがそのディレクトリ(またはそのサブディレクトリ)を作業ディレクトリとして持っている場合、cd .不平を言うでしょう。
クサラナンダ

4
フェデリコ、サイトのルールと私自身の個人的なルールに従って、私はあなたの答えに反対票を投じるべきです。しかし、あなたは新しいです。ようこそ!他の答えのいくつかをレビューしてください。その後、答えが間違っていると思われる場合は、削除してください。この質問や他の質問に他の回答をお楽しみください。
daveloyall

2
特にスクリプティングでは、「何もしない」ことが必要な場合があります。
マシューナジモン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.