执行了:
cd ~ && mkdir mytmp && cd mytmp/
echo > somefile
并在bash脚本中执行此操作 mytmp / myscript.sh :
#!/bin/bash
# version 1
cmd="find . -type f -printf %f\n"
$cmd
呈现想要的结果,即:
somefile
myscript.sh
请注意,出于某种原因,我不需要用引号括住%f \ n,因为如果我要在终端中编写命令,我会这么做。这样做会导致错误的结果:
#!/bin/bash
# version 2
cmd="find . -type f -printf '%f\n'"
$cmd
结果:
'somefile
''myscript.sh
'
我需要执行 $ cmd 和同时打印它,因为我在终端中写了它。
在echo $cmd
中添加version 1
可以正确执行命令,但不带引号回显命令。
在echo $cmd
中添加version 2
使用引号回显命令,就像我想要的那样,但是命令执行的结果很糟糕。
我怎样才能做到这一点?
答案 0 :(得分:0)
我实际上已经得到了这个问题的答案,但是因为我“意外地”得到了我想要的东西并且在搜索后没有在网上找到答案,我想我还是会在这里发布。
解决方案包括version 2
中的引号,并在使用 eval 执行命令时删除它们:
#!/bin/bash
cmd="find . -type f -printf '%f\n'"
eval $cmd
echo $cmd
答案 1 :(得分:0)
使用set -v
。
我使用了一些过于复杂的脚本,测试输出以便引用等等。
#! /bin/bash
set -v
myVariable='test'
# a comment
echo "$(echo "$myVariable") two" | cat -
运行脚本时输出$ ./myscript
myVariable='test' # a comment echo "$(echo "$myVariable") two" | cat - echo "$myVariable" test two
正如我们所看到的,保留了引号,变量名和注释,但子shell中的命令将出现两次。由于你不使用任何子壳,这应该不是问题。