首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Ansible不能执行这个简单的shell脚本?

为什么Ansible不能执行这个简单的shell脚本?
EN

Stack Overflow用户
提问于 2015-02-12 12:15:27
回答 2查看 1.7K关注 0票数 1

我在Ansible (1.8.2)中遇到了一个非常奇怪的问题,它归结为在shell脚本中执行这个简单的命令:

代码语言:javascript
复制
#!/bin/sh

# transform a String into lowercase chars:
echo "TeSt" | tr [:upper:] [:lower:]

当我登录到远程Solaris机器时,无论我在哪个shell (例如,/bin/sh/bin/bash),这个脚本似乎都能工作:

代码语言:javascript
复制
# ./test.sh 
test

同样,当我使用远程ssh命令执行这个脚本时,它可以工作:

代码语言:javascript
复制
# ssh root@<remote-host> '/tmp/test.sh'
test

但是,当我使用Ansible commandshell模块执行相同的脚本时,无论我指定了什么shell,都会得到一个“坏字符串”错误:

代码语言:javascript
复制
- 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模块一起工作:

代码语言:javascript
复制
- raw: executable=/bin/sh /tmp/test.sh        [OK]

有人知道为什么shellcommand模块会产生这个错误吗?

有关脚本失败的远程主机的更多信息:

  • SunOS 5.10属_150401-18 i86pc i386 i86pc
  • 所有的shell (/bin/sh/bin/bash/bin/ksh)都是GNU,版本4.1.2(1)-release (x86_64-redhat-linux-gnu)
  • Python 2.6.6

地点不一样!当我登录或执行远程ssh命令时,区域设置如下所示:

代码语言:javascript
复制
LANG=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=

但是,关于Ansible,我得到了以下信息:

代码语言:javascript
复制
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=
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-13 13:34:01

好吧。所以,不管Jens怎么说,这个脚本在大多数环境中并没有“坏掉”。我测试了它在bashbash --posixdashbusybox shksh下编写的pdksh包,并且在所有情况下都能工作。

因此,我搜索了特定的错误消息(Bad string),发现:

http://sourceforge.net/p/wrapper/bugs/229/

这似乎准确地描述了你的问题。它不是脚本中的一个bug,而是Solaris上的tr中的一个bug。

票数 3
EN

Stack Overflow用户

发布于 2015-02-13 07:58:16

无论您有什么其他问题,您的tr命令肯定有一个问题,

代码语言:javascript
复制
tr [:upper:] [:lower:]

因为[]是由shell扩展的字符范围规范。如果碰巧有一个名为:uperlow的文件,那么在tr将其视为参数之前,将对其进行扩展:

代码语言:javascript
复制
$ touch u
$ echo [:upper:]
u

Fix:使用引号,如

代码语言:javascript
复制
tr '[:upper:]' '[:lower:]'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28477244

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档