Подтвердить что ты не робот

Повторное использование вывода последней команды в Bash

Является ли вывод команды Bash сохраненной в любом регистре? Например. что-то похожее на $? захват вывода вместо статуса выхода.

Я могу назначить вывод переменной с помощью:

output=$(command)

но что больше набрав...

4b9b3361

Ответ 1

Вы можете использовать это: $(!!) для повторного использования (не повторного использования) вывода последней команды.

!! самостоятельно выполняет последнюю команду.

$ > echo pierre
pierre
$ > echo my name is $(!!)
echo my name is $(echo pierre)
my name is pierre

Ответ 2

Ответ - нет. Bash не выделяет какой-либо вывод никакому параметру или какому-либо блоку в его памяти. Кроме того, вы можете разрешать доступ только к Bash посредством разрешенных операций с интерфейсом. Bash личные данные недоступны, если вы не взломали его.

Ответ 3

Один из способов сделать это - использовать trap DEBUG:

f() { bash -c "$BASH_COMMAND" >& /tmp/out.log; }
trap 'f' DEBUG

Теперь самая последняя выполненная команда stdout и stderr будет доступна в /tmp/out.log

Единственным недостатком является то, что он выполнит команду дважды: один раз перенаправить вывод и ошибку на /tmp/out.log и один раз в обычном режиме. Вероятно, есть и способ предотвратить это поведение.

Ответ 4

Если вы находитесь на 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 означает буклет, синоним для буфера обмена.

Ответ 5

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

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, и команда не вызывается дважды.

Ответ 6

Как сказал konsolebox, вам придется взломать сам bash. Здесь - неплохой пример того, как это можно достичь. Хранилище stderred (на самом деле предназначено для раскраски stdout) дает инструкции по его созданию.

Я попробовал: определение нового дескриптора файла внутри .bashrc как

exec 41>/tmp/my_console_log

(число произвольно) и соответствующим образом изменить stderred.c, чтобы контент также записывался в fd 41. Он работал, но содержит множество NUL-байтов, странные формы и в основном двоичные данные, которые невозможно прочитать. Может быть, кто-то с хорошим пониманием C может попробовать это.

Если это так, все, что необходимо для получения последней печатной строки, - tail -n 1 [logfile].

Ответ 7

Не уверен, что именно вам нужно, так что этот ответ может быть неактуальным. Вы всегда можете сохранить вывод команды: 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, и он создаст переменную из этой команды и позволит вам манипулировать ею.

Ответ 8

У меня есть идея, что у меня нет времени, чтобы попытаться реализовать немедленно.

Но что, если вы сделаете что-то вроде следующего:

$ 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!

Возможно, проблемы с буферизацией ввода-вывода. Также файл может быть слишком большим. Нужно было бы придумать решение этих проблем.

Ответ 9

Я думаю, что использование команды сценария может помочь. Что-то вроде

  1. скрипт -c bash -qf fifo_pid

  2. Использование функций bash для установки после разбора.