$_
— это специальный параметр, такой же, как $1
, $-
и т. д. Он реализован как переменная в Bash, но его не следует рассматривать как таковой. См. раздел специальных параметров в руководстве Bash :
.
The shell treats several parameters specially. These parameters may only be referenced; assignment to them is not allowed.
Специальные параметры не являются переменными.
Вы не можете экспортировать его, потому что Bash требует, чтобы :каждый раз, когда анализируется команда, флаг экспорта сбрасывался для _
переменной .
Если абстрагироваться от того, является ли хорошей практикой то, что вы пытаетесь сделать, вот один из них.
#!/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
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
)