【问题标题】:Bash script incorrectly incorporating \r into variableBash 脚本错误地将 \r 合并到变量中
【发布时间】:2019-09-16 02:57:12
【问题描述】:

我有一个在 docker 容器中构建的环境设置脚本。它需要一个键=值对的属性文件,然后通过并使用它们来创建一个环境。我遇到的问题是当我尝试 chown 用户(从属性中提取的值)时,它以“user\r”的形式出现,这会在 chown 上引发错误。

这是在我准备好的 docker 环境中执行的 - CentOS:7 base。从属性文件中提取用户 ID,在容器中创建为用户,并授予对 wheel 组的访问权限(usermod -aG wheel $user),因此他们在容器中拥有权限。

我可以从这个特定的变量中去掉回车,但很好奇我如何才能一起避免这个问题/我是如何导致它的,因为我觉得它可能会导致其他当前不可见的问题。

#!/bin/bash

dirname=$(dirname $0)
input_properties="input-properties"
...
while read -r line; do declare -x "$line"; done <${dirname}/${input_properties}
...
$SUDO mkdir -p $log
...
$SUDO chown -R $app_user: $log

其中 $app_user 和 $log 来自输入属性文件:

app_user=stackoverflow
log=/opt/program-root/logs

错误是

chown: invalid spec: 'stackoverflow\r:'

【问题讨论】:

  • 您读取的文件可能有回车。检查file filename(“使用 CRLF 行终止符”);用dos2unix filename修复。
  • 是的,你是对的。我在vi中跳入文件并修复了ff。不知道为什么我以前发生这种情况时没有想到这一点。谢谢。

标签: bash docker centos chown


【解决方案1】:

您的文件具有 Windows 样式的行尾。最简单的解决方法:

dos2unix ./${input_properties}

【讨论】:

  • 是的,你是对的。我在vi中跳入文件并修复了ff。不知道为什么我以前发生这种情况时没有想到这一点。谢谢。
【解决方案2】:

只需告诉read 命令\r输入字段分隔符

的一部分
while IFS=$' \t\r\n' read -r line; do ...

这比使用翻译快很多,而且不会改变原始文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 2012-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-05-05
    • 2011-04-23
    • 1970-01-01
    相关资源
    最近更新 更多