7

Я хотел бы добавить как последнюю команду, так и вывод последней команды в текстовый файл для целей учебника.

Например: после того, как я выполню команду ls в своем домашнем каталоге, я вижу это на экране

bguiz@sheen:~$ ls
Desktop     Music    Documents

Затем я хочу ввести одну команду, которая добавит следующее в текстовый файл с именем cmd.txt

$ ls
Desktop     Music    Documents

Идея состоит в том, что каждый раз, когда я ввожу команду, я могу записать как саму команду, так и ее вывод в один и тот же файл, и после нескольких команд она продемонстрирует определенную серию команд. Я знаю, что это можно сделать вручную - но зачем это делать, если есть легкая альтернатива, верно?

Это то, что я приготовил до сих пор:

echo -n "\$ " >> cmd.txt; echo !-1:p >> cmd.txt; !-1 >> cmd.txt

Это работает, но довольно неуклюже, и имеет несколько ошибок, таких как неспособность сохранить точное форматирование экрана.

Это более элегантное решение?


Спасибо за ответы до сих пор, но у меня есть требование для работы с pipe, например:

ls -lart | grep ^d

Необходимо добавить это в файл:

$ ls -lart | grep ^d
drwx------ 14 bguiz staff   4096 2010-03-03 15:52 .cache
drwx------  5 bguiz staff   4096 2010-03-03 09:38 .ssh

4 ответа4

10

Скорее проще, чем ум, который вы пытались:

$ script cmd.txt

делай то, что хочешь документировать здесь

затем нажмите Control-d.

Вы можете отредактировать файл позже, чтобы добавить аннотации, если хотите, и вы можете использовать

$ script -a cmd.txt

добавить больше текста в существующий файл.

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

  • Скрипт Mac OS X (т.е. BSD) поддерживает -k который регистрирует ввод с клавиатуры с клавиатуры команды
  • Версия GNU (найденная в системах Linux) поддерживает -c что позволяет вам указывать команду в исходной командной строке, позволяя пропустить бит « напишите здесь демонстрацию, а затем нажмите control-d»
  • Версия BSD также может указывать команду в командной строке, но не принимает флаг для этого, вместо этого она должна следовать имени выходного файла (что требуется в этом случае).

Наконец, версия GNU предупреждает, что vi не очень хорошо представлен в сценариях типов (и я полагаю, что это предупреждение одинаково хорошо применимо ко всем другим командам, использующим curses).

4

Напишите скрипт script.sh как показано ниже, когда вы вставляете аннотацию в виде комментариев:

#!/bin/sh -v

# Annotating the behaviour of the ls command
ls -l

# Other comments on the next command
cmd

Обратите внимание на ключ -v в первой строке:

-v verbose       The shell writes its input to standard error as it is read.

Затем выполните скрипт, перенаправляющий stdout и stderr в файл cmd.txt используя:

$ ./script.sh > cmd.txt 2>&1

Файл cmd.txt будет содержать аннотации, команды и их относительный вывод, например:

# Annotating the behaviour of the ls command
ls -l
total 1824
drwxr-xr-x 11 mrucci mrucci    4096 2010-02-14 18:16 apps
drwxr-xr-x  2 mrucci mrucci    4096 2010-02-20 12:54 bin
-rw-------  1 mrucci mrucci  117469 2010-02-25 11:02 todo.txt

# Other comments on the next command
cmd
./testscript.sh: 7: cmd: not foun

PS: не забудьте дать разрешение на выполнение сценария с:

$ chmod +x script.sh
3

[script.ksh] работает с "script.ksh ls"

#!/bin/ksh

OUTPUT="cmd.txt"

if [[ $# -eq 0 ]];then
  print "no command to run"
  exit
fi

# dump command being run to file
echo $@ >> $OUTPUT

# run command and output stdout to the screen and file
$@ | tee -a $OUTPUT
1

В этих обстоятельствах я обычно использую один из двух методов:

sh -x script

Или просто запустите команды и затем используйте copy'n'paste, чтобы сохранить материал в файл.

Вывод 'sh -x' не включает обычное приглашение PS1 - он использует PS3, который по умолчанию равен '+', IIRC. И это немного изменяет вывод - детали немного варьируются в зависимости от используемой вами оболочки (так что 'bash' делает больше беспорядка, чем 'ksh' или оболочка Bourne). Мне редко нужно больше материала, чем может скопировать copy'n'paste, так что это мой преобладающий способ работы для StackOverflow и SuperUser и т.д.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .