Как я могу сохранить команду и результат выполнения в файл одновременно

Я получаю 2 из вашего кода. Тем не менее, вы можете использовать ту же самую технику для любой переменной или числа:

local start=1
(( start++ ))

или

(( ++start ))

или

(( start += 1 ))

или

(( start = start + 1 ))

или

local start=1
echo $(( start + 1 ))

и др.

3
19.02.2018, 03:39
4 ответа

Haría un guión para algo que hago a menudo.

cat > foo
#! /bin/bash
echo "\$ $1" > "$2"
$1 >> "$2"
^D
chmod +x foo

y luego ejecute

./foo "java -cp src/ nlp.lm.BigramModel atis/ 0.1" "trace/bigram-trace.txt"
0
27.01.2020, 21:13

Puedes hacer algo como esto:

echo date | script -q bigram-trace.txt

Resultado:

$ cat bigram-trace.txt
date
sh-4.4$ date
Sun, Feb 18, 2018  6:22:13 PM
sh-4.4$ exit

O sin tubo:

script -q bigram-trace.txt <<'eof'
date
eof
3
27.01.2020, 21:13

Un método que es simple y conveniente, especialmente si desea guardar no solo un comando sino varios, es ejecutar primero el comando scripty luego ejecutar sus comandos. scriptguarda tanto la entrada como la salida de cada comando. Cuando haya terminado, escriba exito ctrl -D para salir script.

Por ejemplo, para registrar tanto la entrada como la salida de dos comandos:

$ script
Script started, file is typescript
$ date
Sun Feb 18 16:59:45 PST 2018
$ for i in {1..3}; do echo $((i**2)); done
1
4
9
$ exit
Script done, file is typescript

Para ver la información guardada, catel archivotypescript:

$ cat typescript
Script started on Sun 18 Feb 2018 04:59:37 PM PST
$ date
Sun Feb 18 16:59:45 PST 2018
$ for i in {1..3}; do echo $((i**2)); done
1
4
9
$ exit

Script done on Sun 18 Feb 2018 05:00:13 PM PST

scripttiene muchas opciones. Ver man scriptpara más detalles.

1
27.01.2020, 21:13
( exec >logfile 2>&1; set -x; somecommand )

или просто

( set -x; somecommand ) >logfile 2>&1

Это включит трассировку в подоболочке (...)и перенаправит весь вывод в файл logfile.

Если somecommandравно mount, то файл logfileможет выглядеть как

+ mount
/dev/sd0a on / type ffs (local)
/dev/sd0d on /tmp type ffs (local, nodev, nosuid, softdep)
/dev/sd0e on /var type ffs (local, nodev, nosuid)
/dev/sd0f on /usr type ffs (local, nodev)
/dev/sd0g on /usr/local type ffs (local, nodev, wxallowed)
/dev/sd0h on /home type ffs (local, nodev, nosuid, wxallowed, softdep)
/dev/sd0j on /backup type ffs (local, nodev, nosuid)
/dev/sd0k on /extra type ffs (local, nodev, nosuid, wxallowed, softdep)
mfs:92196 on /tmp_mfs type mfs (asynchronous, local, nodev, nosuid, wxallowed, size=8388608 512-blocks)

Знак «плюс»+␣(и пробел )перед командой — это подсказка трассировки или четверичная подсказка, которую можно изменить, установив PS4в строку подсказки:

( PS4='$ '; set -x; df /tmp ) >logfile 2>&1

Вышеизложенное может привести к чему-то вроде

$ df /tmp
Filesystem  512-blocks      Used     Avail Capacity  Mounted on
/dev/sd0d     10315164       160   9799248     0%    /tmp

в logfile.

Это хорошо работает для простых команд, которые могут быть всем, что вам нужно. Для составных команд другие ответы, использующие scriptили аналогичные утилиты, могут лучше подойти, поскольку трассировка оболочки составных команд не отображается, поскольку кто-то мог их ввести. Кроме того, переменные и т. д. будут расширены в выводе трассировки.

4
27.01.2020, 21:13

Теги

Похожие вопросы