当前位置: 首页>>技术教程>>正文


在输出文件中包含命令?

,

问题描述

抱歉标题令人困惑!

假设我跑

apt-cache depends kde-window-manager > ~/Desktop/kwin-depends

我将在桌面文件夹中获得一个名为 “kwin-depends” 的文件。

是否有一些技巧可以将我发出的命令作为文件的一部分包含在内,最好是在文件的开头?

因此,至少在 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

次佳办法

你可以做:

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

  • tee(即 apt-cache depends kde-window-manager)的 STDOUT 将被馈送到 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>

第三种办法

最简约 – 方法 #4 和 #3,两者都可以转换为函数; #2 我最喜欢的 – awk 。 #1 使用 script 命令 – 非常通用的工具,对于一般记录命令行很有用;适用于任何地方,无论您想记录什么。

方法#1:\n有一个 /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 脚本或命令运行 shell 命令。输出将显示在屏幕上,先是命令,然后是输出。要将您看到的内容重定向到文件,请使用 > 运算符。

这可以通过两种方式完成 – 要求用户从标准输入或作为命令行参数输入内容。第一个更容易实现,因此发布它。

(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,然后在子shell中运行必要的命令

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:

使用 echohere string (又名 <<< "string" )向 sh -cxargs 提供参数

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 {}; {}"'

第四种办法

  1. 启动script -q outputfile

  2. 执行你的命令

  3. CtrlD

  4. 打开文件outputfile


例子

启动script

[aboettger:~/tmp] % script -q ~/Desktop/kwin-depends

开始你的命令

[aboettger:~/tmp] % apt-cache depends kde-window-manager
<kde-window-manager>
[aboettger:~/tmp] % 

CtrlD

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>

第五种办法

如果你想要别名扩展(仅限 bash),你可以这样做:

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

第七种办法

使用 one-line Bash 函数的极其简单的解决方案

准备:

此方法使用自定义 bash 函数来提供所需的功能。您可以通过在终端会话中执行以下行来定义它。请注意,您可以选择任何有效的 bash 变量名称而不是 runandlog

runandlog () ( IFS=' '; printf "[%s] $ %s\n%s\n" "$USER" "${*:2}" "$("${@:2}")" | tee -a "$1" | tail -n +2; )

然而,这仅在当前 Bash 会话中持续存在,这意味着关闭终端窗口后,该功能将消失。\n如果您尝试过并且喜欢它,则可以通过编辑 ~/.bashrc 文件并将此行附加到结束了。

如何使用:

定义该函数后,您可以使用它来运行命令,同时将命令本身及其输出记录到文件中。您甚至可以添加更多信息,例如执行它的用户(我已将其包含在函数中)或运行的确切时间。欢迎评论Feature-requests! 🙂

语法很简单:

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

丑陋,但有效!

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13797.html,未经允许,请勿转载。