в сценарии bash; stdout процесса в качестве аргумента имени файла не работает, если вы открываете его более одного раза

[115877]Подстановки команд и переменные расширяются внутри двойных кавычек, поэтому в

#!/bin/sh
gedit $( find -name "$1" )

[116225]$(get_krb)[116226] расширяется в момент этого назначения, в то время как вы хотите, чтобы оно расширялось при каждом запросе через [116227]prompt_subst[116228]. Итак:

1
23.08.2015, 20:56
3 ответа

Это ошибка в вашем скрипте. Используйте тройник , если вы хотите дублировать данные, которые могут быть прочитаны только один раз. Как объясняется в другом ответе, <(cmd) создает канал и помещает / dev / fd / 62 или аналогичный в командной строке:

echo <(true)
  /dev/fd/63

Другой альтернативой tee является here-string:

cmd <<<"$text"

Если вы хотите, чтобы bash создавал tmp-файл с возможностью поиска и перенаправлял ввод из него. (Я не совсем уверен, как бы вы перемотали stdin в начало файла внутри вашей функции. Я думаю, что cat / dev / stdin может просто получить ту же позицию в файле.)

4
27.01.2020, 23:11

В дополнение к предложению @Peter Cordes использовать tee вместо попытки дважды прочитать файл (/ pipe), вот возможная перезапись функции:

bugless_part() {
    tee sample.first >sample.second <"$1"
}

При запуске как bugless_part <(echo "TEST") , он помещает "TEST" в оба файла.

3
27.01.2020, 23:11

Я не думаю, что это ошибка. Вы можете читать / писать в именованный канал, подключенный к командам, подготовленным процессом подстановки , только один раз.

5
27.01.2020, 23:11

Теги

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