Чи зберігається вихід команди Bash у будь-якому регістрі? Наприклад, щось подібне до $?
отримання виводу замість стану виходу.
Я міг би призначити вихідну змінну за допомогою:
output=$(command)
але це більше вводити текст ...
Чи зберігається вихід команди Bash у будь-якому регістрі? Наприклад, щось подібне до $?
отримання виводу замість стану виходу.
Я міг би призначити вихідну змінну за допомогою:
output=$(command)
але це більше вводити текст ...
Відповіді:
Ви можете використовувати $(!!)
для перерахунку (не повторного використання) висновку останньої команди.
The !!
самостійно виконує останню команду.
$ echo pierre
pierre
$ echo my name is $(!!)
echo my name is $(echo pierre)
my name is pierre
$(your_cmd)
за допомогою зворотних посилань: `your_cmd`
Відповідно до посібника Gnu Bash, вони функціонально однакові. Звичайно, це також є предметом попередження, яке порушило @memecs
git diff $(!!)
де попередня команда була find
викликом.
$()
замість задніх планок. Але, мабуть, нема чого втрачати сон. github.com/koalaman/shellcheck/wiki/SC2006
$()
.
Відповідь - ні. Bash не виділяє жодного виводу жодному параметру або блоку в своїй пам'яті. Крім того, вам дозволяється отримувати доступ до Bash лише дозволеними операціями інтерфейсу. Особисті дані Bash недоступні, якщо ви не зламаєте їх.
Один із способів зробити це за допомогою trap DEBUG
:
f() { bash -c "$BASH_COMMAND" >& /tmp/out.log; }
trap 'f' DEBUG
Тепер найдавніші виконані команди stdout та stderr будуть доступні в /tmp/out.log
Мінус лише в тому, що він виконає команду двічі: один раз для переадресації виводу та помилки /tmp/out.log
та нормально один раз. Напевно, є якийсь спосіб запобігти і цій поведінці.
rm -rf * && cd ..
, не тільки поточний каталог, але й батьківський dir буде видалено ?? такий підхід здається мені дуже небезпечним
trap '' DEBUG
Якщо ви перебуваєте на комп'ютері 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 in pbcopy
і pbpaste
підставка для картону, синонім буфера обміну.
$ find app -name 'one.php' | xclip $ diff $(xclip -o) /var/bar/two.php
pbpaste
разом із заміною команд.
Натхненний відповіддю anubhava, який я вважаю, що насправді не прийнятний, оскільки виконує кожну команду двічі.
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, і команда не викликається двічі.
grep
і git diff
+1 в будь-якому випадку , хоча
Як казав konsolebox, вам доведеться вилазити на себе. Ось досить хороший приклад того, як можна цього досягти. Складений сховище (фактично призначене для фарбування stdout) дає вказівки щодо його побудови.
Я спробував: визначити якийсь новий дескриптор файлу всередині, .bashrc
як
exec 41>/tmp/my_console_log
(число довільне) і stderred.c
відповідно змініть, щоб вміст також записувався до fd 41. Він начебто працював, але містить навантаження байтів NUL, дивного форматування і, в основному, бінарних даних, не читабельних. Можливо, хтось із хорошими розуміннями C може спробувати це.
Якщо так, то все, що потрібно для отримання останнього надрукованого рядка tail -n 1 [logfile]
.
Так, навіщо вводити зайві рядки щоразу, коли домовлялися. Ви можете переспрямувати повернуті на вхід, але вихід на вхід (1> & 0) - ні. Також ви не хочете знову і знову писати функцію у кожному файлі для одного і того ж.
Якщо ви не експортуєте файли кудись і маєте намір використовувати їх лише локально, у вас може бути встановлений термінал декларації функції. Ви повинні додати функцію у ~/.bashrc
файл чи у ~/.profile
файл. У другому випадку вам потрібно включити Run command as login shell
з Edit>Preferences>yourProfile>Command
.
Складіть просту функцію, скажіть:
get_prev()
{
# option 1: create an executable with the command(s) and run it
echo $* > /tmp/exe
bash /tmp/exe > /tmp/out
# option 2: if your command is single command (no-pipe, no semi-colons), still it may not run correct in some exceptions
#echo `$*` > /tmp/out
# return the command(s) outputs line by line
IFS=$(echo -en "\n\b")
arr=()
exec 3</tmp/out
while read -u 3 -r line
do
arr+=($line)
echo $line
done
exec 3<&-
}
Основний сценарій:
#run your command:
cmd="echo hey ya; echo hey hi; printf `expr 10 + 10`'\n' ; printf $((10 + 20))'\n'"
get_prev $cmd
#or simply
get_prev "echo hey ya; echo hey hi; printf `expr 10 + 10`'\n' ; printf $((10 + 20))'\n'"
Bash зберігає змінну навіть поза попереднім діапазоном:
#get previous command outputs in arr
for((i=0; i<${#arr[@]}; i++)); do echo ${arr[i]}; done
Той, яким я користувався роками.
.bashrc
або .bash_profile
)# capture the output of a command so it can be retrieved with ret
cap () { tee /tmp/capture.out}
# return the output of the most recent command that was captured by cap
ret () { cat /tmp/capture.out }
$ find . -name 'filename' | cap
/path/to/filename
$ ret
/path/to/filename
Я схильний додавати | cap
до кінця всі мої команди. Таким чином, коли я знаходжу, що хочу зробити обробку тексту на виході повільно запущеної команди, я завжди можу отримати її res
.
cat -
в cap () { cat - | tee /tmp/capture.out}
тут? Чи є cap () { tee /tmp/capture.out }
якісь гикавки, яких я пропускаю?
cat - | cat - | cat -
заздалегідь лише те, щоб зробити його цікавішим? 😉 Я виправлю це, як тільки я протестую, щоб переконатися, що це справді чудо
Не впевнений, для чого саме вам це потрібно, тому ця відповідь може бути нерелевантною. Ви завжди можете зберегти результат команди:, 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!
Можуть виникнути проблеми з буферизацією IO. Також файл може бути занадто величезним. Треба було б вирішити ці проблеми.
Якщо ви не хочете перерахувати попередню команду, ви можете створити макрос, який сканує поточний буфер терміналу, намагається відгадати вихід-останньої команди -копіювати, скопіює її в буфер обміну і, нарешті, набере в термінал.
Його можна використовувати для простих команд, які повертають один рядок виводу (тестується на Ubuntu 18.04 с gnome-terminal
).
Встановіть наступні інструменти: xdootool
, xclip
,ruby
У gnome-terminal
шляху до Preferences -> Shortcuts -> Select all
і встановити його Ctrl+shift+a
.
Створіть такий сценарій рубіну:
cat >${HOME}/parse.rb <<EOF
#!/usr/bin/ruby
stdin = STDIN.read
d = stdin.split(/\n/)
e = d.reverse
f = e.drop_while { |item| item == "" }
g = f.drop_while { |item| item.start_with? "${USER}@" }
h = g[0]
print h
EOF
У налаштуваннях клавіатури додайте наступну комбінацію клавіш:
bash -c '/bin/sleep 0.3 ; xdotool key ctrl+shift+a ; xdotool key ctrl+shift+c ; ( (xclip -out | ${HOME}/parse.rb ) > /tmp/clipboard ) ; (cat /tmp/clipboard | xclip -sel clip ) ; xdotool key ctrl+shift+v '
Вищенаведений ярлик: