Почему считанные работы, если stdin перенаправляется к fd4?

yes разработан с этой целью; это производит ту же строку к stdout непрерывно, таким образом, можно передать его по каналу в другой сценарий, и это будет продолжать отвечать на то же для каждой подсказки. Это принимает значение по умолчанию к y таким образом, это может сказать "да" подсказкам, но если Вы просто хотите, чтобы это отправило новой строке каждый раз, когда можно передать его пустая строка как аргумент:

$ yes '' | vmware-script
4
04.05.2015, 03:43
3 ответа

Это перенаправляет stdin (FD0) к FD4, перенаправлениям от /etc/XX/cfg к FD0, читает строку из FD0 и затем кладет обратно FD4 к FD0. Короче говоря, это сохраняет, заменяет и восстанавливает stdin при чтении строки из промежуточного файла.

read line1 < /etc/XX/cfg было бы настолько легче, но невозможно сказать, является ли это допустимая замена, базирующаяся только на показанном коде.

5
27.01.2020, 20:50
  • 1
    Это не "перенаправляет" fd0 к fd4, это "копирует" его (использование dup2 syscall), так, чтобы чтение из любого дескриптора имело тот же эффект. Конечно, это затем перезаписывает fd0, таким образом, можно думать о нем как о "перемещении" дескриптора, если Вам нравится. –  ams 10.04.2012, 13:56
  • 2
    Таким образом, если поток пошел от файла до fd0 от fd0 до fd4, почему был бы, читая из fd0, все еще работают? –  daisy 10.04.2012, 13:59
  • 3
    Это не удаляет поток из старого FD. Плюс, это открывает файл на нем независимо. –  Ignacio Vazquez-Abrams 10.04.2012, 14:00
  • 4
    @warl0ck: существует две части первому должностному лицу. Только между двумя можно считать stdin на обоих дескрипторах. Открытие файла на fd0 перезаписывает старую установку, которая является, почему код сохраняет его на fd4 сначала. –  ams 10.04.2012, 14:51

Переделывать это в 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);
3
27.01.2020, 20:50

Путем я читал, это - на основе раздела страницы справочника удара по ПЕРЕНАПРАВЛЕНИЮ - является этим 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

Надо надеяться, это объясняет это.

0
27.01.2020, 20:50
  • 1
    я думаю, что Вы неправильно поняли: нет никаких чтений от fd4 здесь. –  ams 10.04.2012, 15:48
  • 2
    Прочитав Ваш комментарий выше, я думаю, что Вы правы, я имею. –  da-architect 10.04.2012, 15:54

Теги

Похожие вопросы