2013-05-04 103 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