【发布时间】:2015-02-13 21:34:01
【问题描述】:
我在 Ansible (1.8.2) 中遇到了一个非常奇怪的问题,归结为在 shell 脚本中执行这个简单的命令:
#!/bin/sh
# transform a String into lowercase chars:
echo "TeSt" | tr [:upper:] [:lower:]
当我登录远程 Solaris 机器时,无论我在哪个 shell(例如,/bin/sh、/bin/bash)中,此脚本似乎都可以工作:
# ./test.sh
test
当我使用远程 ssh 命令执行此脚本时,它也可以工作:
# ssh root@<remote-host> '/tmp/test.sh'
test
但是,当我使用 Ansible command 或 shell 模块执行相同的脚本时,无论我指定什么 shell,我都会收到“错误字符串”错误:
- shell: executable=/bin/sh /tmp/test.sh [FATAL stderr: Bad string]
- shell: executable=/bin/bash /tmp/test.sh [FATAL stderr: Bad string]
- command: /tmp/test.sh [FATAL stderr: Bad string]
我花了很长时间才发现它可以与 raw 模块一起使用:
- raw: executable=/bin/sh /tmp/test.sh [OK]
有人知道为什么shell 和command 模块会产生这个错误吗?
有关脚本失败的远程主机的更多信息:
- SunOS 5.10 Generic_150401-18 i86pc i386 i86pc
- 所有 shell(
/bin/sh、/bin/bash、/bin/ksh)都是 GNU bash,版本 4.1.2(1)-release (x86_64-redhat-linux-gnu) - Python 2.6.6
地区不同!当我登录或执行远程 ssh 命令时,区域设置如下所示:
LANG=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=
但是,使用 Ansible,我明白了:
LANG=en_US.UTF-8
LC_CTYPE=en_US.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_ALL=
【问题讨论】:
-
引用
tr的参数有帮助吗?这是在什么样的系统上运行?语言环境是什么? -
我添加了一些系统信息。引用
tr的参数不是一个选项,该脚本是软件包安装的一部分,我无法修改该代码。 -
@dokaspar 那么是时候向编写该损坏脚本的人报告错误了。
-
@Jens:是的,我一定会这样做的!
-
您能否将 tr 脚本替换为另一个脚本,忽略参数而只执行
tr '[:upper:]' '[:lower:]'。或者当您不想更改 tr 时,在执行包安装之前更改您的 PATH?
标签: string bash shell solaris ansible