2013-05-04 116 views
1

我使用不同的参数运行脚本等等。当我运行脚本时,它会输出一个标题:标题必须包含它运行的命令。我如何在头文件中运行命令?Bash:运行结果标题的命令

目标

$ head ~/dominances_0_0.25_0.5_0.75_1.txt 

----------------------------------------- 
SYSTEM TESTING FILE for BEPO 
TIMESTAMP: 201305041511 
PWD: /Users/abc/abc/systemTestFiles 
RUN-COMMAND: ./bin/diffExpectedActual.sh > ~/dominances_0_0.25_0.5_0.75_1.txt 
----------------------------------------- 

失败

$ ./bin/diffExpectedActual.sh > ~/dominances_0_0.25_0.5_0.75_1.txt 
$ head bin/diffExpectedActual.sh 
#!/bin/bash 

echo "-----------------------------------------" 
echo "SYSTEM TESTING FILE for BEPO" 
echo "TIMESTAMP: " `date +"%Y%m%d%H%M"` 
echo "PWD: " `pwd` 
echo "COMMAND: " SOME_COMMAND_HERE_TO_TELL_THE_RUN_COMMAND?!?! 
echo "-----------------------------------------" 
+1

你在找[this](http://stackoverflow.com/questions/5750450/bash-print-each-command-before-executing)吗? – tarrsalah 2013-05-04 12:33:04

+1

@tarrsalah谢谢 - 不在这里,但可以在调试中变得有用。下面的答案解决了这个问题。谢谢大家! – hhh 2013-05-04 13:43:12

+0

...错误我发现一个案例,当答案没有按预期工作。 – hhh 2013-05-04 14:42:29

回答

1

您可以轻松地做到这一点,但它是一个3步骤的过程。首先,你必须设置你的bash执行precmdCopying form this question,并且from here你应该做的:

第一步 - 救下到任何文件如makelastcomm.sh

set -o functrace > /dev/null 2>&1 
shopt -s extdebug > /dev/null 2>&1 
preexec() { 
    temp=$(tty); echo "$1" >/tmp/lastcommand.${temp:5} 
} 
preexec_invoke_exec() { 
    [ -n "$COMP_LINE" ] && return # do nothing if completing 
    local this_command=`history 1 | sed -e "s/^[ ]*[0-9]*[ ]*//g"`; 
    preexec "$this_command" 
} 
trap 'preexec_invoke_exec' DEBUG 

第二步 - 源成当前的bash

source makelastcomm.sh 

第三步 - 你的脚本应该开始为(在我的例子中它被称为hhhqst

#!/bin/bash 
temp=$(tty) 
cat << EOF 
--------------------------- 
SYSTEM TESTING FILE for BEPO 
TIMESTAMP $(date +"%Y%m%d%H%M") 
PWD: $(pwd) 
COMMAND: $(cat /tmp/lastcommand.${temp:5}) 
--------------------------- 
EOF 

#your main script here 
echo "running the the main script for example the date command" 
LC_ALL=C date 

结果。当运行hhhqst作为

bash hhhqst 

会得到

--------------------------- 
SYSTEM TESTING FILE for BEPO 
TIMESTAMP 201305041939 
PWD: /Users/jm/tmp 
COMMAND: bash hhhqst 
--------------------------- 
running the the main script for example the date command 
Sat May 4 19:39:13 CEST 2013 

时将例如重定向运行作为

./hhhqst >/tmp/hhh.out 

/tmp/hhh.out将包含

--------------------------- 
SYSTEM TESTING FILE for BEPO 
TIMESTAMP 201305041940 
PWD: /Users/jm/tmp 
COMMAND: ./hhhqst >/tmp/hhh.out 
--------------------------- 
running the the main script for example the date command 
Sat May 4 19:40:39 CEST 2013 

完成。

The principe。挂钩bash调试陷阱我们将其放入历史记录的最后一条命令/tmp/lastcomm.your_terminal中。所以,当你运行脚本时,脚本只会读取上述文件中的内容。

2

参数通常存储在$0$*的执行文件的名称和地址。您可以使用在这里记录简化脚本:

#! /bin/bash 
cat << EOF 
------- 
SYSTEM TESTING FILE for BEPO 
TIMESTAMP $(date +"%Y%m%d%H%M") 
PWD: $(pwd) 
COMMAND: $0 $* 
------- 
EOF 

注意,重定向不是$*一部分。获取这些信息有点棘手。您可以根据从那里的要求用下面的例子创办和改善你的脚本:

COMMAND: $0 $* > $(readlink -mn "/proc/$$/fd/1") 
+0

对不起,有一种情况不起作用'“./bin/diffExpectedActual.sh 2324 24> ../ notCaptured.txt”':现在这个命令不会将stdout命令存储到文件'notCaputed.txt'中。它只存储'./bin/diffExpectedActual.sh 2324'这个部分,而不是'> ../ notCaptured.txt'部分。为什么? – hhh 2013-05-04 14:39:41

+0

我无法理解'$ 0 $ *> $(readlink -mn“/ proc/$$/fd/1”),你想用它演示什么?我得到错误,如'readlink:非法选项 - m'。你正在用filedescipors做些什么,想着...... – hhh 2013-05-04 14:43:03

+0

@hhh:如果readlink版本不支持这个选项,那么不用'-m'试试。 '/ proc/$$/fd/1'包含有关bash脚本标准输出的一些信息。例如,尝试'ls -l/proc/self/fd/2 2>/dev/null'。 – nosid 2013-05-04 14:52:08