今ばかのように感じる。なぜこれが機能しないのですか?
echo "/some/directory/path" | xargs -n1 cd
今ばかのように感じる。なぜこれが機能しないのですか?
echo "/some/directory/path" | xargs -n1 cd
回答:
パイプはサブプロセスでxargsを実行し、xargsはサブプロセスでcdを実行します。サブプロセスの変更は、親プロセスに伝播されません。
cd `echo "/some/directory/path" | cut -d\ -f1`
目的の効果を得ることができます(スペースで分割し、xargsのように最初のアイテムを取得するために「カット」を追加したことに注意してください)
xargs
はcd
、それは必然的にシェル組み込みであり、xargs
独立した実行可能ファイルのみを実行できるため、実行できません。ただし、サブプロセスについてはあなたが言ったことは真実です。
cd `port file libcudd | sed -e 's/\/Portfile//'`
通常、このMacPorts Portfileの場所のように、手動で処理したくない長いパス)。
cd
現在のディレクトリに関する情報はプロセスに関連付けられており、実行中のシェルの現在のディレクトリを変更できるのはシェル組み込みコマンドだけであるため、コマンドは組み込みコマンドです。
コードには2つの問題があります。
xargs
組み込みコマンドであり、実行可能ファイルのみを実行できるcd
ためcd
、実行できませんxargs
。cd
fromから呼び出されたサブプロセスで実行した場合でも、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'