【问题标题】:strange characters when redirecting to file in bash script [duplicate]重定向到bash脚本中的文件时出现奇怪的字符[重复]
【发布时间】:2018-08-10 01:52:51
【问题描述】:

我有一个包含行的 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++ 中):

文件看起来像这样:

或在 vim 中:

脚本有什么问题?因为当我将这些行复制到 bash 中时它可以工作,只有当我运行脚本时它才会产生那些奇怪的字符......

【问题讨论】:

  • 脚本没有录制。它是手写在一个文件中的。然后当它执行时,它会导致问题。当我在文本编辑器中打开 sh 文件时,复制这些行并将它们粘贴到终端中,它可以正常工作。
  • $(basename $remote_temp_dir) 扩展为什么?
  • 如何运行脚本?脚本是否以#!/bin/bash 开头?

标签: linux bash shell


【解决方案1】:

您遇到了困扰echo 命令的不一致行为的一部分。具体来说,echo 的某些版本(在某些模式下)会解释要求打印的字符串中的转义(反斜杠)序列。其他人没有。当您要求echo 打印%SYSTEMROOT%\era_rd_6HbUKJTR\EraAgentInstaller.bat 时,它可能看到\e 部分并认为它应该将其转换为ASCII escape character

请注意,这里有两个不同的字符被称为“转义”: 反斜杠被 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 格式格式化的字符串从不解释转义符。请注意,在单命令版本中,格式字符串将应用于其他两个参数中的每一个,因此每个参数在末尾都有一个换行符,因此每个都在输出文件中的单独一行结束。

【讨论】:

    猜你喜欢
    • 2020-03-22
    • 2021-04-16
    • 2020-07-20
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    相关资源
    最近更新 更多