К сожалению, я должен ответить на вопрос сам теперь. "К сожалению", потому что ответ "нет, Это не возможно".
Я смотрел на то, как КАША работает и пришла к выводу, что логически невозможно сохранить пароль как значение хэш-функции.
С КАШЕЙ имя пользователя и пароль отправляются непосредственно стороне аутентификации. Поэтому пароль должен быть известен, зная, что некоторый хеш не достаточен.
Благодарен за то, что @tink ищет, тем не менее.
Но я все еще ничего не мог найти об этой внешней вещи устройства хранения данных. Решение для меня в этом особом случае использует незашифрованный Wi-Fi (который также обеспечивается моим университетом), и VPN.
eval
не считывает свою командную строку из stdin.
eval "$(cat file.txt)"
# or easier, in ksh/bash/zsh
eval "$(<file.txt)"
# usually you cannot be sure that a command ends at the end of line 5
eval "$(head -n 5 file.txt)"
Вместо eval
можно использовать стандарт .
или bash
/zsh
/ksh
ksh
, если команды все равно находятся в файле:
source ./file
(обратите внимание, что важно добавить это /
. В противном случае источник
ищет файл
в $PATH
, прежде чем рассматривать файл
в текущем каталоге. Если в режиме POSIX bash
даже не рассматривает файл в текущей директории, даже если он не найден в
$PATH
).
Это, конечно же, не работает с выбором части файла. Это можно сделать с помощью:
head -n 5 file.txt >commands.tmp
source ./commands.tmp
Или (с помощью ksh93, zsh, bash):
source <(head -n 5 file.txt)
так что... решение вашего вопроса возможно на 100%, и (в контекстеmake
)важно.
Я столкнулся с этим в make-файле, и учитывая сложность вложения команд bash в make-файл, который уже использует $(...)
для вызова переменных, приятно иметь возможность делать именно то, о чем вы спрашиваете.
Вместо использования eval
просто используйте awk
или perl
системную команду:
// command_list.sh:
echo "1"
echo "2"
echo "3"
// command line prompt:
$: cat command_list.sh | awk '{system($0)}'
1
2
3
А, командный пункт:
// a readable version--rather than building up an awk miniprogram,
// split into logical blocks:
$: cat inputs.txt | awk '{print "building "$1" command "$2" here "}' | awk '{system($0)}'
Технически невозможно оценить что-то в вашей текущей среде, если вы хотите прочитать это из конвейера, поскольку каждая команда в конвейере выполняется как отдельный процесс.
Однако, в зависимости от того, чего вы пытаетесь достичь, это может не иметь значения. В любом случае здесь работает eval
с содержимым канала:
❯ echo echo hi | eval "$(cat -)"
hi
Вот пример подвоха. Что-то вроде следующего не будет напечатано1
:
❯ echo a=1 | eval "$(cat -)"; echo $a
Вместо этого нам пришлось бы сделать следующее:
❯ echo a=1 | { eval "$(cat -)"; echo $a; }
1
Если вы не собираетесь использовать eval
, используйтеsh
:
cat file.txt | sh
Да, он будет работать в отдельном экземпляре sh, но этот факт -задокументирован.
И ещеwhile read
:
cat file.txt | while read cmd; do eval $cmd; done
Выполнить команду на 5-й строке файла.txt:
sed -n 5p file.txt | sh
(Я понимаю, что это старый вопрос.)