Похоже, что 7z не может писать в канал, поэтому я написал следующую функцию bash для эмуляции этой функциональности.
Я знаю, что это простая проблема, но это моя первая функция bash, и я чувствую, что очень легко написать ошибочный код в bash, поэтому любая обратная связь приветствуется.
function 7z2pipe () (
local out_dir=$(mktemp -d)
local out_file="${out_dir}"/temp.7z
local log_file="${out_dir}"/"outz.txt"
7z -p"weak_password" -mhe=on a "${out_file}" "$@" &> "${log_file}"
if [ $? -ne 0 ]; then
cat "${log_file}"
return $?
fi
cat "${out_file}"
)
1 ответ
Вы хотите создавать постоянные временные файлы?
Обратите внимание, что в то время как настройки по умолчанию для mktemp
поместите вещи в / tmp, чтобы он, в конечном итоге, собирал мусор, он не собирался немедленно. Что-то может сохраняться в / tmp в течение нескольких дней.
cat
имеет код возврата
Я не уверен, почему возвращают код возврата из cat
. Разве не имеет смысла возвращать код возврата из 7z
?
Альтернативный код
local return_code=$?
if [ ${return_code} -ne 0]; then
cat "${log_file}"
else
cat "${out_file}"
fi
rm -rf ${out_dir}
return ${return_code}
В результате все останется в том виде, в котором вы их нашли, без дополнительных временных каталогов или файлов.
Он всегда будет возвращать код возврата из 7z
.
Он выведет либо файл журнала, либо выходной файл, как вы это делали изначально.
Перенаправить на stderr
Я не уверен, что я бы поступил именно с твоим подходом. Альтернативой созданию файла журнала было бы перенаправление stdout
к stderr
.
local out_file=$(mktemp --suffix .7z)
7z -p"weak_password" -mhe=on a "${out_file}" "$@" 1>&2
local return_code=$?
cat "${out_file}"
rm -f ${out_file}
return ${return_code}
Теперь stdout
будет содержать сжатый файл и stderr
будет весь вывод команды.
Примечание. Обычно я не использую функции Bash, поэтому не принимайте все, что я говорю, как подтверждение синтаксиса функции.