はCD

2017-04-22 3 views
0

を使用してディレクトリを変更私は、次のコマンドを実行しました出力file.txtは表示されますが、ディレクトリは変更されません。同じコマンドを次の順序で実行すると、cdが子プロセスのディレクトリを変更するため、結果が同じになるため、このコマンドは機能しません。はCD

cd /mnt/c/Users/Daniel/Documents/Assg/ 

は、トリックを行う必要があり、私はあなたが提示する理由コマンドにもう少し行きたい:

cat file.txt | cd /mnt/c/Users/Daniel/Documents/Assg/ 
+1

このコンテキストでパイプ( '|')を使用することは意味がありません。あるコマンドの出力を別のコマンドの入力に接続することになっていますが、 'cd'は標準入力を無視し、' cat'はファイルの引数が与えられたらそれを無視します。 –

+0

'/ var/tmp'に行き、' cd/etc/apt/| cat sources.list'を実行すると、私のシェルは 'cat:sources.list:No such file or directory'と応答します。 OPは、元のディレクトリまたはその内容が何であるかを決して指定しませんでした。 –

+0

@Fernando再現可能な例をご提供ください。代替ディレクトリの例を含めます(/ var/tmp?から動作しますか?)、およびその内容また、使用するシェルとOS +リリースを指定します。 –

答えて

0

はちょうどcd /mnt/c/Users/Daniel/Documents/Assg/

+1

これが正解である理由について追加情報を追加することを検討してください。コードのみの回答はあまり役に立たない傾向があります。 –

0

としてはすでに、次のように述べられて試してみてください期待どおりに動作しません。 Bash(および他のシェル)では、親シェルの下で複数の「サブシェル」を実行できます。これらのサブシェルにはそれぞれ独自の作業ディレクトリがあります。実行したときにパイプラインでコマンドを実行すると、サブシェルが作成されます。サブシェルの作業ディレクトリが変更されましたが、作業していたシェルには何の影響もありませんでした。

+0

cd/mnt/c/Users/Daniel/Documents/Assg /が親シェルで実行されるはずです。 cat file.txtは子シェルで実行されます。 – Fernando

+0

@GeorgeVasiliouあなたはOPと同じ罠に陥る。 'cd ...'と 'echo ...'は別々の並列プロセスで動作します。 'cd'は' $ PWD'には影響しません。 –

0

異なるオプションがあります。
は、変更dirは

cd /mnt/c/Users/Daniel/Documents/Assg/ && cat file.txt 

を働いていたときにのみcatを実行DIR

cd /mnt/c/Users/Daniel/Documents/Assg/ ; cat file.txt 

を変更しようとした後catを実行し、他のディレクトリにcatを実行しますが、終了時に現在のディレクトリに戻ります。

(cd /mnt/c/Users/Daniel/Documents/Assg/ && cat file.txt) 
# or 
cat /mnt/c/Users/Daniel/Documents/Assg/file.txt 

EDIT:
あなたの質問: "なぜdoesntのcd /mnt/c/Users/Daniel/Documents/Assg/ | cat file.txt、ディレクトリ変更?。" 2つの方法で答えることができます。
技術的な説明は@Henkによって与えられます(パイプはサブシェルを導入し、サブシェルの環境設定はシェルが終了すると失われます)。
機能上の説明は、達成しようとしているものに対して間違った構文を使用したことです。

+0

質問に答えて元のコマンドラインが機能しない理由を説明できますか? –

0

それはあなたがパイプラインで2つのコマンドを実行すると、通常、1つまたはコマンドの両方を別々の子プロセスで実行され、使用するシェル

に依存します。

旧式のシェルでは、これは両方のシェルで使用されますが、後のシェルでは 最初のまたはのいずれかになります。

ある時点で、ksh93チームはパイプラインの最後のコマンドを親にすることにしました。これにより競合状態が回避され、コマンドが組み込みの場合は、現在のシェル の内部で実行され、パイプラインの結果が保持されます。

でも、cdは、入出力(stderrの診断を除く)を消費または生成せず、パイプラインでそれを使用するコマンドです。 それ自体は単なる愚かです。より良い、より予測可能なので、コマンドラインは次のようになります。

cd /mnt/c/Users/Daniel/Documents/Assg/ && cat file.txt 

これはcdが成功した場合catにのみ実行され、その後、 が指定したディレクトリからfile.txtの内容が表示されますことを保証します。