我不记得有时使用的确切命令和技巧来解决大部分工作,因此我尝试将它们记录到文件中以供将来参考。我通常所做的只是将整个命令放入 echo 中并将其快速附加到文件中。
这一直有效,但是第一次出现以下情况,我无法按照上面的说明进行操作。
成功记录
$ echo "cat file1.txt | paste -d, - - ## Step 3 " >> ~/globalLog.txt
被困在这里了
$ echo "cat file2.txt | sed 's/"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
上面给出了一个明显的错误,因为引号没有正确关闭(下降到第二个命令 propmt (PS2
我猜?)以完成命令,即在我的情况下), sed 命令正在使用>_
单引号( ) sed 表达式中使用'
双引号 ( ) 进行替换。"
在这种情况下我将如何包含完整的命令?
答案1
您可以完全避免使用此处的文档进行引用。请注意,在单/双引号中设置标签(如下面示例中的“EOF”)会禁用文本中的变量和命令评估。
cat <<"EOF" >>~/globalLog.txt
cat file2.txt | sed 's/"//g' > file3.txt ## Step 2
EOF
答案2
您有多种选择,每种选择在不同情况下都很方便。
将整个字符串作为一个双引号,并转义内部的文字双引号(如果只有一个这样的出现,则很容易阅读,但最终可能会得到一个尖桩篱栅):
echo "cat file2.txt | sed 's/\"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
对字符串的不同部分使用不同的引号:
echo "cat file2.txt | sed 's/"'"'"//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
使用
echo
处理多个参数的能力。这适用于只有一个单词包含有问题的字符,因为结果通常在每个参数之间有一个空格,所以它不适用于您的字符串。替代示例:echo 'foo"' "'bar"
印刷
foo" 'bar
使用多个
echo -n
语句 (orprintf %s
) 后跟echo
without-n
:echo -n "cat file2.txt | sed '" >> ~/globalLog.txt echo -n 's/"' >> ~/globalLog.txt echo "//g' > file3.txt ## Step 2 " >> ~/globalLog.txt
根本不要使用引号,但转义所有特殊字符:
echo cat\ file2.txt\ \ \|\ sed\ \'s/\"//g\'\ \>\ file3.txt\ \#\#\ Step\ 2\ >> ~/globalLog.txt
注意不可能在单引号字符串中转义单引号。
如果有疑问,使用更多报价™。
然而,就您而言,您似乎在执行命令之前记录了该命令。已经有一个非常好的解决方案了将命令作为文本使用。
答案3
有一种简单、系统且符合 POSIX 标准的报价方式任何细绳。你只需要记住两条规则:
- 用反斜杠引用撇号(单引号),如下所示:
\'
- 通过用撇号括住撇号来引用除撇号之外的所有内容,如下所示:
'printf "foo\n"'
为了说明如何一起使用这些规则,don't
可以像这样系统地引用这个词:'don'\''t'
您通常可以找到一种更易读的方式来引用字符串,但是当事情变得复杂时,这是获得所需引用的可靠方式。
问题中字符串的引用形式是:
$ echo 'cat file2.txt | sed '\''s/"//g'\'' > file3.txt ## Step 2 ' >> ~/globalLog.txt
答案4
只是
$ cat >> ~/globalLog.txt
<now type your command>
echo "cat file2.txt | sed 's/"//g' > file3.txt ## Step 2 "
<hit ctrl-d>