xargsを使用してディレクトリにcdする


回答:


22

パイプはサブプロセスでxargsを実行し、xargsはサブプロセスでcdを実行します。サブプロセスの変更は、親プロセスに伝播されません。


それは完全に理にかなっています。Unix初心者を助けてくれてありがとう。
イアンロチンスキー

3
バッククォートを使用すると、cd `echo "/some/directory/path" | cut -d\ -f1` 目的の効果を得ることができます(スペースで分割し、xargsのように最初のアイテムを取得するために「カット」を追加したことに注意してください)
Slartibartfast

5
実際にxargscd、それは必然的にシェル組み込みであり、xargs独立した実行可能ファイルのみを実行できるため、実行できません。ただし、サブプロセスについてはあなたが言ったことは真実です。
追って通知があるまで一時停止します。

/ usr / bin / cdは、少なくともSolaris上では、間違いなくUnixで文書化されたコマンドです。
-jlliagre

自動生成されたパスに@Slartibartfastを使用する:(cd `port file libcudd | sed -e 's/\/Portfile//'` 通常、このMacPorts Portfileの場所のように、手動で処理したくない長いパス)。
イオアニスフィリピディス13

23

cd現在のディレクトリに関する情報はプロセスに関連付けられており、実行中のシェルの現在のディレクトリを変更できるのはシェル組み込みコマンドだけであるため、コマンドは組み込みコマンドです。

コードには2つの問題があります。

  1. xargs組み込みコマンドであり、実行可能ファイルのみを実行できるcdためcd、実行できませんxargs
  2. cdfromから呼び出されたサブプロセスで実行した場合でも、xargs上記で説明したように親プロセスには影響しません。

解決策は、サブシェルを実行し、その内部で実行するcdと、新しい現在のディレクトリでコマンドを実行できることです。

ls | xargs -L 1 bash -c 'cd "$0" && pwd && ls'

ls | xargs ...この例で行うのは意味がありません。の$0ように値を渡す必要がありますecho "/some/directory/path" | xargs -L 1 bash -c 'cd "$0" && pwd && ls'
-wisbucky

IMOのより良い解決策は次のとおりです。xargs -L 1 -I @@ bash -c 'cd @@ && pwd && ls'
ローマンM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.