Извините за запутанный заголовок!
Предположим, я бегу
apt-cache depends kde-window-manager > ~/Desktop/kwin-depends
Я получу файл с именем "kwin-disabled" в папке 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>
command-line
bash
Д. К. Бозе
источник
источник
Ответы:
Я бы просто использовал простую функцию. Добавьте это в ваш
~/.bashrc
файл:Теперь, когда вы хотите запустить команду и распечатать ее, вы можете сделать:
Выше приведен этот файл:
источник
apt-cache depends
чтобыacd
я получаю «Нет команды„ДС“найдено, вы имели в виду: ...» , когда я бегruncom acd leafpad > out
.ls
псевдонимls --color=auto'
в реальности. Что вы могли бы сделать ( до тех пор, пока не будет ни одного одинарных или двойные кавычек в псевдониме), заключается в следующем:$ terdonsFunction $(alias ls | awk -F '=' '{$1="";print}'| tr "'" " ")
.MYCOMMAND="apt-cache depends"; terdonsFunction $MYCOMMAND leafpad > out.txt
Ты можешь сделать:
То же самое, используя
echo
вместо строк здесь (<<<
):tee
будет писать в STDOUT, а также в файлfile.txt
STDOUT из
tee
ieapt-cache depends kde-window-manager
будет использоватьсяbash
для запуска команды и добавления STDOUT кfile.txt
.Пример:
источник
tee
но мой продолжал терпеть неудачу. Молодец! +1tee
кажется, аккуратно :)Наиболее минималистичный подход № 4 и № 3, оба могут быть преобразованы в функцию; № 2 мой любимый -
awk
. # 1 используетscript
команду - очень универсальный инструмент, полезный для записи командной строки в целом; применимо где угодно, для всего, что вы хотите записать.Подход № 1: Существует
/usr/bin/script
команда (которая поставляется с ubuntu по умолчанию) для записи выходных данных командной строки, которая захватывает все вместе с приглашением и командой. Чтобы просто сохранить одну команду и ее вывод в конкретный файл, используйте-c
флаг и укажите выходной файл. примерПодход № 2: awk взломать
Awk имеет
system()
функцию, которая позволяет запускать команды оболочки изawk
скрипта или команды . Вывод будет отображаться на экране, сначала команда, затем выход. Чтобы перенаправить увиденное в файл, используйте>
оператор.Это можно сделать двумя способами - попросить пользователя ввести данные из стандартного ввода или в качестве аргумента командной строки. Первого легче достичь, поэтому публикуем это.
(1)
awk 'BEGIN{ print "Enter command to run: "; getline com < "/dev/stdin"; system(com) }'
(2) версия аргументов командной строки; не включая вывод, чтобы избежать слишком длинного ответа. Снова, добавьте,
>
чтобы перенаправить в файлПодход № 3: попросите Bash сделать работу за вас
Перенаправить в файл с
>
оператором:bash -c ' MYCOMMAND="apt-cache depends gnome-terminal"; echo $MYCOMMAND ; $MYCOMMAND ' > output.txt
Подход № 4: (мой второй любимый)
Вдохновленный постом ByteCommander; мы можем использовать,
read
а затем запустить необходимые команды в subshellОбразец прогона:
Подход № 5:
Используйте
echo
илиhere string
(иначе<<< "string"
) для предоставления аргументовsh -c
черезxargs
И если вы хотите, вы можете использовать этот же трюк с псевдонимом:
источник
awk
самом деле это очень настраиваемый маленький парень, не так ли? Скрипт выглядит удобным и для других целей.script -q outputfile
outputfile
пример
Начало
script
Начни свою команду
Нажмите Ctrl-D
Покажите свою команду и вывод
и вы увидите что-то вроде этого
источник
Если вы хотите расширение псевдонима (только bash), вы можете сделать это следующим образом:
Теперь вы можете запустить
источник
Там может быть более простой способ, но вы можете сделать это с помощью сценария:
Создайте файл
script
с этим содержимым в вашей домашней папке и дайте разрешение на выполнениеЗапустите это так:
источник
script.sh
всегда создавал файлscript.log
с его выводом.Чрезвычайно простое решение с использованием однострочной функции Bash
Приготовление:
Этот подход использует пользовательскую функцию bash для обеспечения желаемой функциональности. Вы определяете это, выполняя следующую строку в терминальной сессии. обратите внимание, что вы можете выбрать любое допустимое имя переменной bash вместо
runandlog
:Это, однако, сохраняется только для текущего сеанса Bash, что означает, что после закрытия окна терминала функция исчезнет.
Если вы попробовали и понравились, вы можете сделать его всегда доступным, отредактировав свой
~/.bashrc
файл и добавив эту строку в конец.Как пользоваться:
После определения функции вы можете использовать ее для запуска команд, одновременно регистрируя как саму команду, так и ее вывод в файл. Вы можете даже добавить больше информации, например, пользователя, который ее выполнил, который я уже включил в функцию, или точное время ее запуска. Feature-запросы в комментариях приветствуются! :)
Синтаксис прост:
Пример:
Пример сеанса от имени пользователя
bytecommander
, работающего из домашнего каталога, может выглядеть так:Это приведет к созданию нового файла
mylogfile
(если он уже существует, функция добавит к нему вывод!) В текущем каталоге с содержимым:источник
Довольно хитрый, но функциональный трюк будет:
Уродливо, но это работает!
источник
Вы можете просто передать команду функции, которая сначала напечатает команду, а затем ее вывод (перенаправления намеренно исключаются из напечатанной команды, вы можете легко изменить это, удалив кавычки из команды и напечатав и запустив
$@
вместо этого из$1
в функции):Чтобы добавить команду впоследствии, вы можете запустить эту команду, которая вставит последнюю команду, выполненную вверху файла:
<<<"[...]"
: здесь строка;[...]
перенаправлен наcat
sstdin
;$(<foo)
: подстановка команд; это заменено содержанием "foo";cat [...] - >foo
: Сцепляетstdin
к[...]
и выводит на «Foo»;<([...])
: замена процесса: он заменяется дескриптором файла, содержащим выходные данные[...]
;history 2 | sed -n '1s/ [0-9][0-9]* \(.*\)/\1\n/p'
: выводит последние две команды, удаляет два пробела, за которыми следуют одна или несколько цифр, за которыми следуют два пробела из первой строки, и печатает ее;источник
$1
? И в этом нет необходимостиeval
.eval
не нужно, не уверен, почему я добавил это раньше. Благодарю.