1

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

目标

$ 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 "-----------------------------------------"
4

2 回答 2

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" )
于 2013-05-04T13:17:35.667 回答
1

你可以很容易地做到这一点,但这是一个 3 步的过程。首先,您必须设置 bash 以执行precmd. 复制这个问题从这里你应该做:

第一步- 将下一个保存到任何文件中,例如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

完毕。

原则。挂钩 bash 调试陷阱,我们将其放入/tmp/lastcomm.your_terminal历史记录的最后一个命令中。因此,当您运行脚本时,脚本只会从上述文件中读取内容。

于 2013-05-04T17:47:29.903 回答