我在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模块会产生这个错误吗?
有关脚本失败的远程主机的更多信息:
/bin/sh,/bin/bash,/bin/ksh)都是GNU,版本4.1.2(1)-release (x86_64-redhat-linux-gnu)地点不一样!当我登录或执行远程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=发布于 2015-02-13 13:34:01
好吧。所以,不管Jens怎么说,这个脚本在大多数环境中并没有“坏掉”。我测试了它在bash、bash --posix、dash、busybox sh和ksh下编写的pdksh包,并且在所有情况下都能工作。
因此,我搜索了特定的错误消息(Bad string),发现:
http://sourceforge.net/p/wrapper/bugs/229/
这似乎准确地描述了你的问题。它不是脚本中的一个bug,而是Solaris上的tr中的一个bug。
发布于 2015-02-13 07:58:16
无论您有什么其他问题,您的tr命令肯定有一个问题,
tr [:upper:] [:lower:]因为[]是由shell扩展的字符范围规范。如果碰巧有一个名为:、u、p、e、r、l、o或w的文件,那么在tr将其视为参数之前,将对其进行扩展:
$ touch u
$ echo [:upper:]
uFix:使用引号,如
tr '[:upper:]' '[:lower:]'https://stackoverflow.com/questions/28477244
复制相似问题