решение состоит в том, чтобы удалить пробелы вывода, избивают удар:
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();
Во-первых, давайте посмотрим на то, что мы видим в терминале:
$ 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"