Является ли вывод команды Bash сохраненной в любом регистре? Например. что-то похожее на $?
захват вывода вместо статуса выхода.
Я могу назначить вывод переменной с помощью:
output=$(command)
но что больше набрав...
Является ли вывод команды Bash сохраненной в любом регистре? Например. что-то похожее на $?
захват вывода вместо статуса выхода.
Я могу назначить вывод переменной с помощью:
output=$(command)
но что больше набрав...
Вы можете использовать это: $(!!)
для повторного использования (не повторного использования) вывода последней команды.
!!
самостоятельно выполняет последнюю команду.
$ > echo pierre
pierre
$ > echo my name is $(!!)
echo my name is $(echo pierre)
my name is pierre
Ответ - нет. Bash не выделяет какой-либо вывод никакому параметру или какому-либо блоку в его памяти. Кроме того, вы можете разрешать доступ только к Bash посредством разрешенных операций с интерфейсом. Bash личные данные недоступны, если вы не взломали его.
Один из способов сделать это - использовать trap DEBUG
:
f() { bash -c "$BASH_COMMAND" >& /tmp/out.log; }
trap 'f' DEBUG
Теперь самая последняя выполненная команда stdout и stderr будет доступна в /tmp/out.log
Единственным недостатком является то, что он выполнит команду дважды: один раз перенаправить вывод и ошибку на /tmp/out.log
и один раз в обычном режиме. Вероятно, есть и способ предотвратить это поведение.
Если вы находитесь на mac и не возражаете хранить свой вывод в буфере обмена вместо записи в переменную, вы можете использовать pbcopy и pbpaste в качестве обходного пути.
Например, вместо этого, чтобы найти файл и разделить его содержимое с другим файлом:
$ find app -name 'one.php'
/var/bar/app/one.php
$ diff /var/bar/app/one.php /var/bar/two.php
Вы можете сделать это:
$ find app -name 'one.php' | pbcopy
$ diff $(pbpaste) /var/bar/two.php
Строка /var/bar/app/one.php
находится в буфере обмена при запуске первой команды.
Кстати, pb в pbcopy
и pbpaste
означает буклет, синоним для буфера обмена.
Вдохновлен ответом анубхавы, который, на мой взгляд, неприемлем, поскольку он запускает каждую команду дважды.
save_output() {
exec 1>&3
{ [ -f /tmp/current ] && mv /tmp/current /tmp/last; }
exec > >(tee /tmp/current)
}
exec 3>&1
trap save_output DEBUG
Таким образом, выходные данные последней команды находятся в /tmp/last, и команда не вызывается дважды.
Как сказал konsolebox, вам придется взломать сам bash. Здесь - неплохой пример того, как это можно достичь. Хранилище stderred (на самом деле предназначено для раскраски stdout) дает инструкции по его созданию.
Я попробовал: определение нового дескриптора файла внутри .bashrc
как
exec 41>/tmp/my_console_log
(число произвольно) и соответствующим образом изменить stderred.c
, чтобы контент также записывался в fd 41. Он работал, но содержит множество NUL-байтов, странные формы и в основном двоичные данные, которые невозможно прочитать. Может быть, кто-то с хорошим пониманием C может попробовать это.
Если это так, все, что необходимо для получения последней печатной строки, - tail -n 1 [logfile]
.
Не уверен, что именно вам нужно, так что этот ответ может быть неактуальным. Вы всегда можете сохранить вывод команды: netstat >> output.txt
, но я не думаю, что вы ищете.
Конечно, есть варианты программирования; вы могли бы просто получить программу для чтения текстового файла выше, после того, как эта команда будет запущена, и связать ее с переменной, а в Ruby, на моем языке выбора, вы можете создать переменную из командной строки с использованием "backticks":
output = `ls` #(this is a comment) create variable out of command
if output.include? "Downloads" #if statement to see if command includes 'Downloads' folder
print "there appears to be a folder named downloads in this directory."
else
print "there is no directory called downloads in this file."
end
Вставьте это в файл .rb и запустите его: ruby file.rb
, и он создаст переменную из этой команды и позволит вам манипулировать ею.
У меня есть идея, что у меня нет времени, чтобы попытаться реализовать немедленно.
Но что, если вы сделаете что-то вроде следующего:
$ MY_HISTORY_FILE = 'get_temp_filename'
$ MY_HISTORY_FILE=$MY_HISTORY_FILE bash -i 2>&1 | tee $MY_HISTORY_FILE
$ some_command
$ cat $MY_HISTORY_FILE
$ # ^You'll want to filter that down in practice!
Возможно, проблемы с буферизацией ввода-вывода. Также файл может быть слишком большим. Нужно было бы придумать решение этих проблем.
Я думаю, что использование команды сценария может помочь. Что-то вроде
скрипт -c bash -qf fifo_pid
Использование функций bash для установки после разбора.