0

ls私は(Unixで)書いているCプログラムのコマンドラインに結果をパイプしようとしています。ファイルのインデックスを作成できるようにしたいので、argvを使用することを計画していました。これは私がそれがうまくいくはずだと思った方法です:

./foo &(ls ~/path)

それは機能しません—の出力をls引数としてコマンドに渡す正しい方法は何ですか?

4

3 に答える 3

4

あなたの構文は少しずれています...

./foo $(ls ~/path)

これにより、特定の文字が含まれているファイルが詰まることに注意してください。これを修正するには、代わりに配列を使用してください。

pushd ~/path
files=(*)
popd
./foo "${files[@]}"
于 2013-02-07T03:55:32.503 に答える
2

指定した表記は2つのことを行います。

./foo &

プログラムfooをバックグラウンドで実行します(コマンド名以外の引数はありません)。それで:

(ls ~/path)

サブシェルでコマンドを実行しlsます(このコンテキストでは、メインシェルでコマンドを実行するのと同じです)。$問題は、の代わりに使用することを意図した(または必要とする)ことです&

./foo $(ls ~/path)

これにより、コマンドが実行ls ~/pathされ、出力がキャプチャされます。出力は、単語に分割されます($IFS変数にリストされている区切り文字を使用)。次に、必要に応じて、各単語がコマンドの引数として提供され./fooます。

次に、そのような出力を使用することの知恵について議論することができlsますが、スペース(タブ、改行など)を含むファイル名がない限り、問題はありません。

于 2013-02-07T04:02:18.503 に答える
0

Unix ツールが glob パターンを受け入れる方法を知っているので、パイプ/展開することなくcat *.txtorを実行できます。rm ~/Pictures/Vacation*.jpgls

これは、シェルがプログラムに無料で提供する機能です。

./foo ~/path/*and argv[1]will contain /home/you/path/fileoneargv[2]will containなどを使用するだけ/home/you/path/filetwoです。

openこれらのファイル名は相対または絶対である可能性がありますが、 / fopen/execveまたは使用したい関数にいつでも直接渡すことができます。

あなたが説明したように使用lsすると、ディレクトリのないファイル名の最後の部分しか得られないため、ファイルがどこにあるのかわかりません(ただし、それが必要な場合は、basename(argv[1])).

于 2013-02-07T05:25:51.980 に答える