-2

Я хотел бы перенаправить содержимое файла на ввод команды ls :

ls -l < /home/john/1.txt

где 1.txt контент просто:

/etc

Я ожидал, что ls перечислит содержимое файла, определенного в /home/jonh1.txt - это /etc dir, но, похоже, он игнорирует входной поток - все еще перечисляет содержимое текущего dir, вставленного в /etc dir, как определено в /home/jonh1.txt файл.

3 ответа3

3

кажется, игнорировать входной поток

Да. Программа ls никогда не использует поток ввода, потому что она не была написана для чтения чего-либо из потока ввода. Это не то, что происходит автоматически с любой программой Unix - это должно быть реализовано отдельно.

Не путайте входной поток (stdin) с аргументами командной строки (argv); первый является реальным потоком, который можно читать построчно, в то время как второй является простым массивом слов, доступным только для чтения. В вашем случае оба присутствуют и содержат разные данные.

(Почему он не должен быть автоматическим для всех программ? Ну, в качестве примера возьмем sort или cat или grep . Эти программы принимают различные виды значений - имена файлов в качестве аргументов, но текст в качестве содержимого стандартного ввода. Таким образом, вы можете направить любую команду на | sort и сортировать ввод. Но если бы stdin и командная строка были одним и тем же, вы ничего не могли бы передать в | sort больше, потому что он будет думать, что входной канал представляет собой список имен файлов. Или наоборот, вы не могли бы дать ему имена файлов, потому что они просто сортировали имена.)

В качестве альтернативного варианта см. Это объяснение в StackOverflow (которое вы уже получили в комментариях).

1

Если вы напишите любую программу командной строки, которая принимает данные от пользователя, вы очень четко увидите, что происходит. Если у программы есть read/readLine(разные языки могут дать ей другое имя), оператор, то есть программа запрашивает ввод у пользователя, тогда вы также можете направить или перенаправить этот ввод, используя | или <

Если вы посмотрите на программу, которая принимает ввод, вы увидите, как с more или less , если вы наберете ее без ввода $more<ENTER> , то она запросит ввод. Передавая данные к нему, он останавливает запрос на ввод данных. Если мы запустим sed без параметров $sed<ENTER> тогда он обязательно выдаст ошибку, и мы также не сможем сделать $echo abc|sed<ENTER> . Но если мы делаем $sed 's/a/b/'<ENTER> тогда он запрашивает ввод. И именно поэтому echo abc|sed 's/a/b/'<ENTER> работает.

Вы можете увидеть это, если напишите программу, даже такую простую, как Hello World, но она принимает ввод, как программа запрашивает слово, и если человек набирает "abc", он говорит "Hello abc". Вы сможете подключиться к этой программе. Не требуется никакого дополнительного программирования, чтобы заставить работать трубопровод и перенаправление ввода. Если программа принимает ввод с клавиатуры от пользователя, тогда будет работать конвейер и перенаправление на него, а затем программа не будет запрашивать ввод.

0

Попробуйте использовать xargs:

xargs ls -l < /home/john/1.txt

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .