在bash脚本中重定向到文件时出现奇怪的字符[重复]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在bash脚本中重定向到文件时出现奇怪的字符[重复]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我有一个包含行的bash脚本:
remote_installer_svc_args="$local_cifs_mount/eset-remote-installer.args"
svc_arg_x86="%SYSTEMROOT%\\$(basename $remote_temp_dir)\\$(basename $INSTALLER_BAT)"
svc_arg_x64="%SYSTEMROOT%\\$(basename $remote_temp_dir)\\$(basename $INSTALLER_BAT)"
echo "$svc_arg_x86" > $remote_installer_svc_args
echo "$svc_arg_x64" >> $remote_installer_svc_args
它应该生成一个看起来像这样的文件(在Windows上的notepad ++中):
脚本有什么问题?因为当我将这些行复制到bash中时它才起作用,只有当我运行脚本时它确实产生了那些奇怪的字符......
你遇到了困扰echo
命令的不一致行为的一部分。具体来说,某些版本的echo
(在某些模式下)会解释它们被要求打印的字符串中的转义(反斜杠)序列。其他人没有。当你要求echo
打印%SYSTEMROOT%\era_rd_6HbUKJTR\EraAgentInstaller.bat
时,它可能会看到\e
部分,并认为它应该将其转换为ASCII escape character。
请注意,这里有两个不同的字符称为“escape”:shell使用反斜杠作为转义字符,这意味着它和紧随其后的字符具有一些特殊含义。另一方面,ASCII转义被终端(以及vim和其他一些东西)以某种类似的方式视为特殊字符。由于ASCII转义是一个非打印字符,当notepad ++和vim必须显示它时,它们会显示某种替代表示(“ESC”或“^]”)。
无论如何,由于echo
对反斜杠字符的处理方式不一致,最好避免使用可能包含反斜杠的字符串。请改用printf
(参见"Why is printf better than echo?" on unix.se)。使用起来有点复杂,但也不算太糟糕。要实现的主要内容是printf
的第一个参数是一个“格式”字符串,用于控制其余参数的打印方式,与echo
不同,它不会自动添加换行符。
你想要使用的是:
printf '%s\n' "$svc_arg_x86" > $remote_installer_svc_args
printf '%s\n' "$svc_arg_x64" >> $remote_installer_svc_args
或者您可以将其简化为:
printf '%s\n' "$svc_arg_x86" "$svc_arg_x64" > $remote_installer_svc_args
第一个论点%s\n
说要打印一个简单的字符串后跟一个换行符。始终解释格式字符串中的反斜杠转义符,但使用%s
格式格式化的字符串永远不会解释转义符。请注意,在单命令版本中,格式字符串将应用于其他两个参数中的每一个,因此每个参数都会在结尾处获取换行符,因此每个参数都会在输出文件中的单独行上结束。
以上是关于在bash脚本中重定向到文件时出现奇怪的字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章
使用 Pandas 或命令行上传到 BigQuery 时出现奇怪的重复字段错误。所有字段唯一