我遇到了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
模块执行相同的脚本时,我会得到一个&#34; Bad String&#34;错误,无论我指定什么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 bash,版本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=
答案 0 :(得分:3)
好。因此,尽管Jens说,在大多数环境中,该脚本并没有“破坏”。我在bash
包中的bash --posix
,dash
,busybox sh
,ksh
和pdksh
下进行了测试,并且在所有情况下都是的工作原理。
所以我去搜索特定的错误消息(Bad string
),然后找到了:
http://sourceforge.net/p/wrapper/bugs/229/
这似乎准确描述了您的问题。这不是剧本中的错误;这是Solaris上tr
中的一个错误。
答案 1 :(得分:0)
无论你遇到什么其他问题,你的tr
命令肯定存在问题,
tr [:upper:] [:lower:]
因为[]
是由shell扩展的字符范围 。如果您有一个名为:
,u
,p
,e
,r
,l
,o
的文件,或w
这会在tr
将其视为参数之前展开:
$ touch u
$ echo [:upper:]
u
修复:使用引号,如
tr '[:upper:]' '[:lower:]'