yes
разработан с этой целью; это производит ту же строку к stdout непрерывно, таким образом, можно передать его по каналу в другой сценарий, и это будет продолжать отвечать на то же для каждой подсказки. Это принимает значение по умолчанию к y
таким образом, это может сказать "да" подсказкам, но если Вы просто хотите, чтобы это отправило новой строке каждый раз, когда можно передать его пустая строка как аргумент:
$ yes '' | vmware-script
Это перенаправляет stdin (FD0) к FD4, перенаправлениям от /etc/XX/cfg
к FD0, читает строку из FD0 и затем кладет обратно FD4 к FD0. Короче говоря, это сохраняет, заменяет и восстанавливает stdin при чтении строки из промежуточного файла.
read line1 < /etc/XX/cfg
было бы настолько легче, но невозможно сказать, является ли это допустимая замена, базирующаяся только на показанном коде.
Переделывать это в syscalls (использующий C):
exec 4<&0 0</etc/XX/cfg
/* Duplicate fd0 as fd4. */
dup2 (0, 4);
/* Open file on fd0.
"open" always uses lowest available descriptor, so we don't need to check it. */
close (0);
open ("/etc/XX/cfg", O_RDONLY);
exec 0<&4
/* Close fd0 and duplicate fd4 as fd0. */
dup2 (4, 0);
Путем я читал, это - на основе раздела страницы справочника удара по ПЕРЕНАПРАВЛЕНИЮ - является этим stdin
(fd0) перенаправляется в fd4, затем вводится, взят от /etc/XX/cfg
в stdin
- который закончится на fd4.
read line1
должен затем взять от fd4, который затем отложен к fd0.
Демонстрация могла бы показать мое значение немного лучше и ответить, "почему" Вы могли бы сделать это. Путем добавления другой строки и помещения его в обертку:
$ vim ./test.sh
#!/bin/bash
exec 4<&0 0</etc/XX/cfg
read line1 # reads from fd4
exec 0<&4
read line2 # reads from fd0
echo $line1
echo $line2
Можно передать по каналу или перенаправить stdin
через test.sh, но также и чтение в конфигурации перенаправлением, таким образом, в коде выше я вытянул в значениях от "конфигурации" (предположение с моей стороны на основе имени файла - плохо :)), но я могу обработать через stdin также.
например:
$ ./test.sh < somefile
$ cat somefile | ./test.sh
Надо надеяться, это объясняет это.
dup2
syscall), так, чтобы чтение из любого дескриптора имело тот же эффект. Конечно, это затем перезаписывает fd0, таким образом, можно думать о нем как о "перемещении" дескриптора, если Вам нравится. – ams 10.04.2012, 13:56