Извините за запутывающий заголовок!
Предположим, что я работаю
apt-cache depends kde-window-manager > ~/Desktop/kwin-depends
Я назову файл, "kwin-зависит" в моей папке Desktop.
Там некоторый прием должен включать команду, которую я дал как часть файла, предпочтительно в начале файла?
Так, по крайней мере, в 14.04 LTS, первые несколько строк были бы похожи на это:
apt-cache depends kde-window-manager > ~/Desktop/kwin-depends
kde-window-manager
Depends: kde-runtime
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
Вместо точно так же, как это:
kde-window-manager
Depends: kde-runtime
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
Я просто использовал бы простую функцию. Добавьте это к Вашему ~/.bashrc
файл:
function runcom(){
echo "$@"
## Run the command
$@
}
Теперь, каждый раз, когда Вы хотите управлять командой и напечатать ее, Вы можете сделать:
runcom apt-cache depends kde-window-manager > out
Вышеупомянутое создает этот файл:
$ cat out
apt-cache depends kde-window-manager
kde-window-manager
Depends: perl
Depends: kde-runtime
Depends: kde-style-oxygen
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
libegl1-mesa
Depends: libgcc1
|Depends: libgl1-mesa-glx
Depends: <libgl1>
libgl1-mesa-swx11
libgl1-mesa-glx
|Depends: libgles2-mesa
Depends: <libgles2>
libgles2-mesa
Depends: libice6
Depends: libkactivities6
Depends: libkcmutils4
Depends: libkdeclarative5
Depends: libkdecorations4abi2
Depends: libkdecore5
Depends: libkdeui5
Depends: libkio5
Depends: libknewstuff3-4
Depends: libkwineffects1abi5
Depends: libkwinglesutils1
Depends: libkwinglutils1abi2
Depends: libkworkspace4abi2
Depends: libplasma3
Depends: libqt4-dbus
Depends: libqt4-declarative
Depends: libqt4-script
Depends: libqtcore4
Depends: libqtgui4
Depends: libsm6
Depends: libstdc++6
Depends: libwayland-client0
|Depends: libwayland-egl1-mesa
Depends: <libwayland-egl1>
libwayland-egl1-mesa
Depends: libx11-6
Depends: libx11-xcb1
Depends: libxcb-composite0
Depends: libxcb-damage0
Depends: libxcb-image0
Depends: libxcb-keysyms1
Depends: libxcb-randr0
Depends: libxcb-render0
Depends: libxcb-shape0
Depends: libxcb-shm0
Depends: libxcb-sync1
Depends: libxcb-xfixes0
Depends: libxcb-xtest0
Depends: libxcb1
Depends: libxcursor1
Depends: libxext6
Depends: libxrandr2
Depends: libxxf86vm1
Breaks: kde-style-bespin
Breaks: kde-style-bespin:i386
Breaks: <kde-style-skulpture>
Breaks: <kde-style-skulpture:i386>
Breaks: kde-workspace-data
Breaks: <kde-workspace-data:i386>
Breaks: kdeartwork-theme-window
Breaks: kdeartwork-theme-window:i386
Breaks: <kdebase-workspace-data>
Breaks: <kdebase-workspace-data:i386>
Breaks: kwin-style-crystal
Breaks: kwin-style-crystal:i386
Breaks: kwin-style-dekorator
Breaks: kwin-style-dekorator:i386
Breaks: kwin-style-qtcurve
Breaks: kwin-style-qtcurve:i386
Replaces: kde-workspace-data
Replaces: <kde-workspace-data:i386>
Replaces: <kdebase-workspace-data>
Replaces: <kdebase-workspace-data:i386>
Conflicts: kde-window-manager:i386
script -q outputfile
outputfile
Пример
Начало script
[aboettger:~/tmp] % script -q ~/Desktop/kwin-depends
Начало Ваша команда
[aboettger:~/tmp] % apt-cache depends kde-window-manager
<kde-window-manager>
[aboettger:~/tmp] %
Пресса Ctrl - Шоу D
Script done, file is /home/aboettger/Desktop/kwin-depends
Ваша команда и производит
[aboettger:~/tmp] % cat ~/Desktop/kwin-depends
, и Вы будете видеть что-то вроде этого
[aboettger:~/tmp] % apt-cache depends kde-window-manager
<kde-window-manager>
Если Вы хотите расширение псевдонима (колотите только), Вы можете сделать это этот путь:
function runcmd
{
local check_cmd=${BASH_ALIASES[$1]}
if [ -z "$check_cmd" ]; then
check_cmd=$1
fi
shift #skip 1st arg
echo "$check_cmd $@"
$check_cmd $@
}
Вы можете теперь бежать
runcmd acd leafpad > out
Может быть более легкий путь, но Вы можете сделать это сценарием:
#!/bin/sh
echo $1
apt-cache depends $1
Создают файл script
с этим содержанием в Вашей Домашней папке и дают Шанс разрешения
chmod +x script
выполнения это этот путь:
./script kde-window-manager > ~/Desktop/kwin-depends
Этот подход использует таможенную функцию удара, чтобы обеспечить желаемую функциональность. Вы определяете его, выполняя следующую линию на Вашей предельной сессии. обратите внимание, что Вы можете, выбрал любое действительное имя переменной удара вместо runandlog
:
runandlog () ( IFS=' '; printf "[%s] $ %s\n%s\n" "$USER" "${*:2}" "$("${@:2}")" | tee -a "$1" | tail -n +2; )
Это однако только сохраняется для текущей сессии Удара, которая означает после закрытия окна терминала, функция закончится.
, Если Вы попробовали и любили его, хотя, Вы можете всегда делать его доступным, редактируя Ваш ~/.bashrc
файл и прилагая эту линию до конца его.
определив функцию, Вы можете использовать его, чтобы управлять командами, регистрируясь саму и команду и ее продукцию к файлу. Вы могли даже добавить больше информации как пользователь, который выполнил ее, который я уже включал в функцию, или точное время, которым это было, бежало. Запросы новых функций в комментариях приветствуются! :)
синтаксис прост:
runandlog LOGFILENAME YOUR-COMMAND-WITH-ARGUMENTS
сессия в качестве примера, поскольку пользователь bytecommander
, работающий из корневого каталога мог быть похожим на это:
bytecommander: ~ $ runandlog mylogfile fortune
A mathematician is a device for turning coffee into theorems.
-- P. Erdos
, Который приведет к новому файлу mylogfile
(если он уже существует, функция приложит продукцию к нему!) в текущем каталоге с содержанием:
[bytecommander] $ fortune
A mathematician is a device for turning coffee into theorems.
-- P. Erdos
Довольно неумная, но функциональная уловка была бы:
(echo "apt-cache depends kde-window-manager" && apt-cache depends kde-window-manager) > ~/Desktop/kwin-depends
Ужасный, но это работает!
Можно сделать:
tee file.txt <<<'apt-cache depends kde-window-manager' | bash >>file.txt
Использование того же самого echo
вместо Здесь представляет в виде строки (<<<
):
echo 'apt-cache depends kde-window-manager' | tee file.txt | bash >>file.txt
tee
запишет в STDOUT и также в файл file.txt
STDOUT tee
т.е. apt-cache depends kde-window-manager
будет питаться к bash
выполнять команду и добавлять STDOUT к file.txt
.
Пример:
$ echo 'apt-cache depends kde-window-manager' | tee file.txt | bash >>file.txt
$ cat file.txt
apt-cache depends kde-window-manager
kde-window-manager
Depends: kde-runtime
Depends: libc6
|Depends: libegl1-mesa
Depends: <libegl1-x11>
Вы могли просто передать команду функции, которая распечатает команду сначала, и вывод команды впоследствии (перенаправления не допущены в печатную команду намеренно, можно легко изменить это путем удаления кавычек из команды и путем печати и выполнения $@
вместо $1
в функции):
function myfunction() {
printf "%s\n\n" "$1"
$1
}
$ myfunction "printf \"bar\n\"" > foo
$ cat foo
printf "bar\n"
bar
Для добавления команды впоследствии, Вы могли выполнить эту команду, которая вставит последнюю команду, выполненную наверху файла:
<<<"$(<foo)" cat <(history 2 | sed -n '1s/ [0-9][0-9]* \(.*\)/\1\n/p') - >foo
<<<"[...]"
: здесь строка; [...]
перенаправляется к cat
stdin
;$(<foo)
: замена команды; это заменяется содержанием "нечто";cat [...] - >foo
: конкатенирует stdin
кому: [...]
и выводы к "нечто";<([...])
: замена процесса: это заменяется дескриптором файла, содержащим вывод [...]
;history 2 | sed -n '1s/ [0-9][0-9]* \(.*\)/\1\n/p'
: производит последние две команды, удаляет два пробелов, сопровождаемые одной или несколькими цифрами, сопровождаемыми двумя пробелами от первой строки, и печатает его;$ printf "bar\n" >foo
$ <<<"$(<foo)" cat <(history 2 | sed -n '1s/ [0-9][0-9]* \(.*\)/\1\n/p') - >foo
$ cat foo
printf "bar" >foo
bar
Самый минималистический - подход № 4 и № 3, оба могли быть преобразованы в функцию; № 2 мой фаворит - awk
. Использование № 1 script
команда - очень универсальный инструмент, полезный для записи командной строки в целом; применимый где угодно, для того, что Вы хотите записать.
Подход № 1: существует a /usr/bin/script
команда (который идет с человечностью по умолчанию) для записи вывода командной строки, который получает все, наряду с подсказкой и командой. Чтобы просто сохранить одну команду и ее вывод в определенный файл использовать -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
сценарий или команда. Вывод будет обнаруживаться на экране, управлять сначала, производить затем. Перенаправить то, что Вы видите к использованию файла >
оператор.
Это может быть сделано двумя способами - просит пользователь вводить материал от stdin или как параметр командной строки. Сначала каждого легче достигнуть, следовательно отправляя это.
(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) Командная строка args версия; не включая вывод, чтобы не делать ответ слишком долго. Снова, добавить >
перенаправить в файл
awk 'BEGIN{for (i=1; i<= ARGC; i++) myString = myString" "ARGV[i]; print myString; system(myString) }' apt-cache depends gnome-terminal
Подход № 3: попросите колотить, чтобы сделать задание для Вас
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
и затем выполненные необходимые команды в подоболочке
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 {}; {}"'