Наиболее минималистичный подход № 4 и № 3, оба могут быть преобразованы в функцию; № 2 мой любимый - awk
. # 1 использует script
команду - очень универсальный инструмент, полезный для записи командной строки в целом; применимо где угодно, для всего, что вы хотите записать.
Подход № 1:
Существует /usr/bin/script
команда (которая поставляется с ubuntu по умолчанию) для записи выходных данных командной строки, которая захватывает все вместе с приглашением и командой. Чтобы просто сохранить одну команду и ее вывод в конкретный файл, используйте-c
флаг и укажите выходной файл. пример
xieerqi:$ script -c 'apt-cache depends gnome-terminal' outputFile.txt
Script started, file is outputFile.txt
gnome-terminal
Depends: gconf-service
gconf-service:i386
Depends: libatk1.0-0
Depends: libc6
Depends: libgconf-2-4
Depends: libgdk-pixbuf2.0-0
(extra output omitted)
Script done, file is outputFile.txt
xieerqi:$ cat outputFile.txt
Script started on 2015年10月22日 星期四 08时58分46秒
gnome-terminal
Depends: gconf-service
gconf-service:i386
Depends: libatk1.0-0
Depends: libc6
Depends: libgconf-2-4
(extra output omitted)
Script done on 2015年10月22日 星期四 08时58分46秒
Подход № 2: awk взломать
Awk имеет system()
функцию, которая позволяет запускать команды оболочки из awk
скрипта или команды . Вывод будет отображаться на экране, сначала команда, затем выход. Чтобы перенаправить увиденное в файл, используйте >
оператор.
Это можно сделать двумя способами - попросить пользователя ввести данные из стандартного ввода или в качестве аргумента командной строки. Первого легче достичь, поэтому публикуем это.
(1) awk 'BEGIN{ print "Enter command to run: "; getline com < "/dev/stdin"; system(com) }'
awk 'BEGIN{ print "Enter command to run: "; getline com < "/dev/stdin"; system(com) }'
Enter command to run:
apt-cache depends gnome-terminal
gnome-terminal
Depends: gconf-service
gconf-service:i386
Depends: libatk1.0-0
Depends: libc6
Depends: libgconf-2-4
Depends: libgdk-pixbuf2.0-0
Depends: libglib2.0-0
(extra output omitted)
(2) версия аргументов командной строки; не включая вывод, чтобы избежать слишком длинного ответа. Снова, добавьте, >
чтобы перенаправить в файл
awk 'BEGIN{for (i=1; i<= ARGC; i++) myString = myString" "ARGV[i]; print myString; system(myString) }' apt-cache depends gnome-terminal
Подход № 3: попросите Bash сделать работу за вас
xieerqi@eagle:~$ bash -c ' MYCOMMAND="apt-cache depends gnome-terminal"; echo $MYCOMMAND ; $MYCOMMAND '
apt-cache depends gnome-terminal
gnome-terminal
Depends: gconf-service
gconf-service:i386
Depends: libatk1.0-0
Depends: libc6
Depends: libgconf-2-4
Depends: libgdk-pixbuf2.0-0
Depends: libglib2.0-0
Перенаправить в файл с >
оператором:
bash -c ' MYCOMMAND="apt-cache depends gnome-terminal"; echo $MYCOMMAND ; $MYCOMMAND ' > output.txt
Подход № 4: (мой второй любимый)
Вдохновленный постом ByteCommander; мы можем использовать, read
а затем запустить необходимые команды в subshell
read command && (printf "COMMAND: %s" "$command";printf "\n+++++++\n"; sh -c "$command")
Образец прогона:
xieerqi:$ read command && (printf "COMMAND READ: %s" "$command";printf "\n+++++++\nOUTPUT\n"; sh -c "$command")
printf "This was a triumph; I'm making a note here - huge success"
COMMAND READ: printf "This was a triumph; I'm making a note here - huge success"
+++++++
OUTPUT
This was a triumph; I'm making a note here - huge success
Подход № 5:
Используйте echo
или here string
(иначе <<< "string"
) для предоставления аргументов sh -c
черезxargs
xieerqi:$ echo "apt-cache policy gnome-terminal" | xargs -I {} bash -c 'echo {}; {}'
apt-cache policy gnome-terminal
gnome-terminal:
Installed: 3.6.2-0ubuntu1
Candidate: 3.6.2-0ubuntu1
Version table:
*** 3.6.2-0ubuntu1 0
500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages
100 /var/lib/dpkg/status
И если вы хотите, вы можете использовать этот же трюк с псевдонимом:
xieerqi:$ printAndRun <<< "apt-cache policy gnome-terminal"
apt-cache policy gnome-terminal
gnome-terminal:
Installed: 3.6.2-0ubuntu1
Candidate: 3.6.2-0ubuntu1
Version table:
*** 3.6.2-0ubuntu1 0
500 http://us.archive.ubuntu.com/ubuntu/ trusty/main amd64 Packages
100 /var/lib/dpkg/status
xieerqi:$ type printAndRun
printAndRun is an alias for 'xargs -I {} bash -c "echo {}; {}"'