ls перекачан по трубопроводу в командную строку

Я пытался перекачать по трубопроводу в результатах ls в командную строку для программы C, которую я пишу (в Unix). Я хочу быть в состоянии иметь индекс файлов и таким образом, я был планированием использования argv. Это - то, как я думал, что это должно работать:

./foo &(ls ~/path)

Это не работает — что правильный путь состоит в том, чтобы передать продукцию ls как аргументы команде?

0
nl ja de

3 ответы

Ваш синтаксис - бит прочь...

./foo $(ls ~/path)

Действительно обратите внимание, что это задохнется на файлах с определенными знаками в них. Используйте множество вместо этого, чтобы зафиксировать это.

pushd ~/path
files=(*)
popd
./foo "${files[@]}"
4
добавлено

Примечание, которое вы определили, делает две вещи:

./foo &

управляет программой foo в фоновом режиме (без аргументов кроме его названия команды). Тогда:

(ls ~/path)

runs the ls command in a sub-shell (which, in this context, is the same as running it in the main shell). The problem is you intended (or need) to use $ in place of &.

./foo $(ls ~/path)

Это управляет командой ls ~/путь и захватывает продукцию, которая разделяется на слова (использующий сепараторы, перечисленные в $IFS переменная). Каждое слово тогда поставляется как аргумент команде ./foo , когда вы потребовали.

Мы можем тогда обсудить мудрость использования продукции ls как этот, но если у вас не будет имен файлов, содержащих места (счета, новые строки и т.д.) вы будете в порядке.

2
добавлено

Вы знаете, как инструменты Unix принимают образцы шарика, таким образом, можно сделать кошку *.txt или , комната ~/Pictures/Vacation*.jpg , не имея необходимость перекачивать по трубопроводу/расширять ls ?

Это - способность, которую ваша раковина дает вашей программе бесплатно!

Просто используйте ./foo ~/путь /* и , argv[1] будет содержать /home/you/path/fileone , , который будет содержать argv[2] /home/you/path/filetwo , и т.д.

Эти имена файлов могут быть относительными или абсолютными, но могут всегда передаваться непосредственно, чтобы открытый / fopen / execve или какой бы ни функционируют, вы хотите использовать.

Используя ls , как вы описываете, только даст вам последнюю часть имени файла без справочника, таким образом, вы не будете знать, где файлы должны сделать что-либо с ними (хотя, если это - то, что вы хотите, просто используйте базовое имя (argv[1])) .

0
добавлено
pro.bash
pro.bash
123 участник(ов)

All about Nix shells, signals, processes and development in general.