vipe, неправильно себя ведущие на ударе, обрабатывают замену

решение состоит в том, чтобы удалить пробелы вывода, избивают удар:

res=`xxd -p $exportedkey`
echo "${res//[[:space:]]/}"

в php:

$hex = hex2bin($result);
header("Content-Description: File Transfer");
header("Content-Type: application/octet-stream");
header("Content-Transfer-Encoding: binary");
header("Content-Disposition: attachment; filename=hex.pfx");
header('Content-Length: '.  strlen($hex));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');

echo $hex;
exit();
4
28.03.2015, 02:41
1 ответ

Во-первых, давайте посмотрим на то, что мы видим в терминале:

$ echo <(vim)
/dev/fd/63
$ Vim: Warning: Output is not to a terminal

Обратите внимание, что вы сразу же получаете приглашение, не дожидаясь завершения работы редактора. Подстановка процесса не дожидается завершения команды, она создает канал между командой и оболочкой. Имя этого канала передается команде, аргументом которой является подстановка процесса, здесь echo , которая выводит это имя и немедленно возвращает, после чего bash закрывает канал.

Vim все еще работает, и его стандартный ввод и стандартная ошибка связаны с терминалом, но не стандартный вывод.Итак, Vim получает ввод и выдает несколько сообщений об ошибках, но большая часть его отображения идет на стандартный вывод, который представляет собой сломанный канал.

И bash, и vim читают с терминала. Это приводит к тому, что ваши нажатия клавиш будут отправляться несколько случайным образом тому или другому. Обычно такой ситуации не происходит, потому что фоновым процессам запрещено чтение с терминала - если они попытаются это сделать, они получат сигнал SIGTTIN, а если они проигнорируют сигнал, тогда их вызов read возвращает ошибку. Но в этом случае vim выполняется как часть группы процессов переднего плана, потому что подстановка процесса не создает новую группу процессов, следовательно, она может читать с терминала и захватывать некоторые нажатия клавиш.

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


Подстановка процесса не создает временный файл, она создает канал, поэтому ваш подход не имеет смысла. Zsh имеет конструкцию замещения процесса, которая создает временный файл ( = (somecommand) ), но это тоже не сработает: вы можете запустить echo = (vipe < / dev / null) , и это распечатает имя временного файла, который на момент печати был только что удален.

Чтобы сделать то, что вы хотите, вам нужно самостоятельно обработать удаление временного файла. Я не думаю, что есть какая-то оболочка, которая может вам в этом помочь. Вызовите mktemp , чтобы создать временный файл, а затем отредактируйте его обычным способом.

tmpfile=$(mktemp)
"${VISUAL:-"${EDITOR:-vi}"}" "$tmpfile"
echo "$tmpfile"
…
rm "$tmpfile"
4
27.01.2020, 20:55

Теги

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