Linux 执行`";后获取已执行的命令,带引号的params${argv[@]}`
此功能的工作原理是:Linux 执行`";后获取已执行的命令,带引号的params${argv[@]}`,linux,bash,shell,Linux,Bash,Shell,此功能的工作原理是: source foo.bash && foo -n "a b c.txt" 问题是,无论我尝试了什么,我都无法获得最后一行echo“$CMD”(或echo$CMD)来准确生成此输出: cat -n "a b c.txt" 如何做到这一点 # foo.bash function foo() { local argv=("$@"); local OUT=`cat "${argv[@]}"` local CMD=`echo cat "$
source foo.bash && foo -n "a b c.txt"
问题是,无论我尝试了什么,我都无法获得最后一行echo“$CMD”
(或echo$CMD
)来准确生成此输出:
cat -n "a b c.txt"
如何做到这一点
# foo.bash
function foo() {
local argv=("$@");
local OUT=`cat "${argv[@]}"`
local CMD=`echo cat "${argv[@]}"`
echo "--------------------------"
echo "$OUT"
echo "--------------------------"
echo "$CMD"
}
相反,输出为:
cat -n a b c.txt
使用此命令:foo-n \“abc.txt\”
它确实可以用于显示命令,但它通过反勾号给出了执行错误
文件
“a b c.txt”
是一个有效的小文本文件。您需要在作业中转义引号:
local CMD="cat \"${argv[@]}\""
另外,连接字符串不需要echo。好了,在我的帮助下,我找到了正确的解决方案 我几乎忘记了为什么我们需要引用一个论点,因为它有多个词
function foo() {
local argv=( "$@" );
local OUT=`cat "${argv[@]}"`
echo "--------------------------"
echo "$OUT"
echo "--------------------------"
local CMD="cat"
for word in "${argv[@]}"; do
words="${word//[^\ ]} "
if [[ ${#words} > 1 ]]; then
local CMD="$CMD \"${word}\""
else
local CMD="$CMD $word"
fi
done
echo "$CMD"
}
希望它能帮助到别人。我提供了一个答案,但我希望你不打算用这个输出调用eval。我不确定这是否可行,当你说
foo-n“abc.txt”
bash将参数视为-n
和abc.txt
删除引号并保留空格。在foo-n \“abc.txt\”
的情况下,参数是-n
,“a
,b
&c.txt”
。我不确定你是否能做你想做的事情,即让bash保留引号,而默认行为恰好是剥离。也许IFS
magic。。。或者别的什么。我想不出什么对吗away@another.anon.coward是的,但它确实适用于localout=`cat“${argv[@]}”`
,如果不可能,它也不应该适用于那个。对吗?对不起,我不太明白OUT
将包含cat-nbc.txt
的输出,其中abc.txt
是一个有效文件,否则它不会包含任何内容,因为缺少的文件将显示在stderr
上,该文件将不会保存在OUT
中。只是为了澄清文件名包含“
s”,这将给出cat'-nbc.txt“
,这也不是我所期望的。请注意,提供的代码只是一个PoC,可能有任何标志(命令实际上是git
)。我希望与键入的内容完全相同:cat-n“abc.txt”
@Flavius-引号实际上从未传递给被调用的函数。