Включать команду в выходной файл?

Извините за запутывающий заголовок!

Предположим, что я работаю

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>
17
задан 22 October 2015 в 07:18

9 ответов

Я просто использовал бы простую функцию. Добавьте это к Вашему ~/.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
18
ответ дан 23 November 2019 в 02:16
  1. Начало script -q outputfile
  2. Выполняет Вашу команду
  3. Пресса Ctrl - D
  4. Открывает файл 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>
6
ответ дан 23 November 2019 в 02:16

Если Вы хотите расширение псевдонима (колотите только), Вы можете сделать это этот путь:

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
5
ответ дан 23 November 2019 в 02:16

Может быть более легкий путь, но Вы можете сделать это сценарием:

#!/bin/sh
echo $1
apt-cache depends $1

Создают файл script с этим содержанием в Вашей Домашней папке и дают Шанс разрешения

chmod +x script

выполнения это этот путь:

./script kde-window-manager > ~/Desktop/kwin-depends
4
ответ дан 23 November 2019 в 02:16

Чрезвычайно простое решение, используя короткую функцию Удара

Подготовка:

Этот подход использует таможенную функцию удара, чтобы обеспечить желаемую функциональность. Вы определяете его, выполняя следующую линию на Вашей предельной сессии. обратите внимание, что Вы можете, выбрал любое действительное имя переменной удара вместо 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
4
ответ дан 23 November 2019 в 02:16

Довольно неумная, но функциональная уловка была бы:

(echo "apt-cache depends kde-window-manager" && apt-cache depends kde-window-manager) > ~/Desktop/kwin-depends

Ужасный, но это работает!

3
ответ дан 23 November 2019 в 02:16

Можно сделать:

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>
11
ответ дан 23 November 2019 в 02:16

Вы могли просто передать команду функции, которая распечатает команду сначала, и вывод команды впоследствии (перенаправления не допущены в печатную команду намеренно, можно легко изменить это путем удаления кавычек из команды и путем печати и выполнения $@ вместо $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
2
ответ дан 23 November 2019 в 02:16

Самый минималистический - подход № 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 {}; {}"'
11
ответ дан 23 November 2019 в 02:16

Другие вопросы по тегам:

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