Запишите несколько строк в дескриптор файла без here-doc и удалите его после чтения <&{fd} без блокировки

$_ — это специальный параметр, такой же, как $1, $-и т. д. Он реализован как переменная в Bash, но его не следует рассматривать как таковой. См. раздел специальных параметров в руководстве Bash :

.

The shell treats several parameters specially. These parameters may only be referenced; assignment to them is not allowed.

Специальные параметры не являются переменными.

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

1
09.11.2020, 17:56
2 ответа

Если абстрагироваться от того, является ли хорошей практикой то, что вы пытаетесь сделать, вот один из них.

#!/usr/bin/env bash

auth() { 
    exec 3< <(printf "%s\n%s\n" "$1" "$2")
}

auth test pwd
sh -c 'cat <&3'

Результат, как и ожидалось:

$./auth.bash 
test
pwd
2
19.03.2021, 02:26

FWIW, ты всегда можешь сделать:

auth() {
  exec 3<<< "$1"$'\n'"$2"
}

или:

auth() {
  eval $'exec 3<< EOF\n$1\n$2\nEOF'
}

Не уверен, что это сильно улучшит разборчивость.

Версии Bash до 5.1 использовали удаленный временный файл для здесь документов или здесь строк, а начиная с 5.1 используют канал для краткого содержимого и удаленный временный файл для тех, которые не помещаются в канал.

Это означает, что в более новых версиях данные могут быть прочитаны только один раз из этого fd 3 (перемотка назад(lseek())невозможна, и нельзя снова прочитать с начала, открыв/proc/self/fd/3)

0
19.03.2021, 02:26

Теги

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