ls
私は(Unixで)書いているCプログラムのコマンドラインに結果をパイプしようとしています。ファイルのインデックスを作成できるようにしたいので、argvを使用することを計画していました。これは私がそれがうまくいくはずだと思った方法です:
./foo &(ls ~/path)
それは機能しません—の出力をls
引数としてコマンドに渡す正しい方法は何ですか?
あなたの構文は少しずれています...
./foo $(ls ~/path)
これにより、特定の文字が含まれているファイルが詰まることに注意してください。これを修正するには、代わりに配列を使用してください。
pushd ~/path
files=(*)
popd
./foo "${files[@]}"
指定した表記は2つのことを行います。
./foo &
プログラムfoo
をバックグラウンドで実行します(コマンド名以外の引数はありません)。それで:
(ls ~/path)
サブシェルでコマンドを実行しls
ます(このコンテキストでは、メインシェルでコマンドを実行するのと同じです)。$
問題は、の代わりに使用することを意図した(または必要とする)ことです&
。
./foo $(ls ~/path)
これにより、コマンドが実行ls ~/path
され、出力がキャプチャされます。出力は、単語に分割されます($IFS
変数にリストされている区切り文字を使用)。次に、必要に応じて、各単語がコマンドの引数として提供され./foo
ます。
次に、そのような出力を使用することの知恵について議論することができls
ますが、スペース(タブ、改行など)を含むファイル名がない限り、問題はありません。
Unix ツールが glob パターンを受け入れる方法を知っているので、パイプ/展開することなくcat *.txt
orを実行できます。rm ~/Pictures/Vacation*.jpg
ls
これは、シェルがプログラムに無料で提供する機能です。
./foo ~/path/*
and argv[1]
will contain /home/you/path/fileone
、argv[2]
will containなどを使用するだけ/home/you/path/filetwo
です。
open
これらのファイル名は相対または絶対である可能性がありますが、 / fopen
/execve
または使用したい関数にいつでも直接渡すことができます。
あなたが説明したように使用ls
すると、ディレクトリのないファイル名の最後の部分しか得られないため、ファイルがどこにあるのかわかりません(ただし、それが必要な場合は、basename(argv[1]))
.