Bash:使用反引号执行带引号空格的命令

时间:2013-07-30 21:21:58

标签: bash date backticks

我写了以下bash函数。它应该打印一个命令,运行它并打印它的输出,并打印一个简短的描述。

#!/bin/bash

print_and_run_command() {
    COMMAND="$1"
    DESCRIPTION="$2"
    OUTPUT="`$COMMAND`"
    printf "%-30s %-30s %s\n" "$COMMAND" "$OUTPUT" "$DESCRIPTION"
}

print_and_run_command "date +%S" "Second"
print_and_run_command" date +%H" "Hour"
print_and_run_command "date +%Y-%m-%dT%H:%M:%S%z" "T-separated rfc 3339 / ISO 8601"

从shell执行时,每个日期命令都能正常工作。但是,在运行脚本时,会发生奇怪的错误:

date +%S                       34                             Second
./blah.sh: line 11: print_and_run_command date +%H: command not found
date +%Y-%m-%dT%H:%M:%S%z      2013-07-30T14:20:34-0700       T-separated rfc 3339 / ISO 8601

正在运行date +%H失败,即使date +%S和复杂的date +%Y-%m-%dT%H:%M:%S%z工作正常。

任何想法print_and_run_command" date +%H" "Hour"失败了什么?

1 个答案:

答案 0 :(得分:1)

好吧,让set -x帮助我们了解实际情况。

+ print_and_run_command 'date +%S' Second
+ COMMAND='date +%S'
+ DESCRIPTION=Second
++ date +%S
+ OUTPUT=13
+ printf '%-30s %-30s %s\n' 'date +%S' 13 Second
date +%S                       13                             Second
+ 'print_and_run_command date +%H' Hour
./oh.sh: line 13: print_and_run_command date +%H: command not found
+ print_and_run_command 'date +%Y-%m-%dT%H:%M:%S%z' 'T-separated rfc 3339 / ISO 8601'
+ COMMAND='date +%Y-%m-%dT%H:%M:%S%z'
+ DESCRIPTION='T-separated rfc 3339 / ISO 8601'
++ date +%Y-%m-%dT%H:%M:%S%z
+ OUTPUT=2013-07-31T01:24:13+0400
+ printf '%-30s %-30s %s\n' 'date +%Y-%m-%dT%H:%M:%S%z' 2013-07-31T01:24:13+0400 'T-separated rfc 3339 / ISO 8601'
date +%Y-%m-%dT%H:%M:%S%z      2013-07-31T01:24:13+0400       T-separated rfc 3339 / ISO 8601
+ set +x

所以这是你的错误:

print_and_run_command" date +%H" "Hour"

应该是

print_and_run_command "date +%H" "Hour"

print_and_run_command" date +%H" "Hour"失败,因为print_and_run_command" date +%H"已扩展为print_and_run_command date +%H,这是shell的未知命令。

相关问题