前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shell 函数带中横线问题排查

Shell 函数带中横线问题排查

作者头像
大江小浪
发布2022-05-06 16:01:34
5350
发布2022-05-06 16:01:34
举报
文章被收录于专栏:小狼的世界小狼的世界

Shell 中编写的函数,如果函数名中带了中横线,在使用 /bin/sh 执行时会报错。

代码语言:javascript
复制
➜  subprocess git:(master) ✗ cat kubectl.sh      

_kubectl_api-resources()
{
    hostname
}

_kubectl_api-resources
➜  subprocess git:(master) ✗ sh kubectl.sh
kubectl.sh: line 5: `_kubectl_api-resources': not a valid identifier

根据 POSIX 的标准,函数名要符合以下的规范。

3.231 Name In the shell command language, a word consisting solely of underscores, digits, and alphabetics from the portable character set. The first character of a name is not a digit.

可以看到,中横线不在标准支持的范围内。因此使用 /bin/sh 执行时,会看到我们上面列出的错误。

但是 bashzsh 却可以支持函数中的中横线。

代码语言:javascript
复制
➜  subprocess git:(master) ✗ cat kubectl.sh      

_kubectl_api-resources()
{
    hostname
}

_kubectl_api-resources
➜  subprocess git:(master) ✗ sh kubectl.sh
kubectl.sh: line 5: `_kubectl_api-resources': not a valid identifier
➜  subprocess git:(master) ✗ bash kubectl.sh
bogon
➜  subprocess git:(master) ✗ zsh kubectl.sh
bogon

因此,如果我们希望我们的 Shell 脚本具有更好的可移植性,那就尽量避免在函数命名时使用中横线。

Python 使用 subprocess.Popen 执行 shell 时,若选择了 shell=True 选项,则会默认使用 /bin/sh。因此在遇到使用了中横线的 shell 函数时,也会报错。如果希望使用 /bin/bash 则需要设置 executable 参数,示例如下:

代码语言:javascript
复制
import subprocess

def bash_command(cmd):
    subprocess.Popen(cmd, shell=True, executable='/bin/bash')

bash_command('a="Apples and oranges" && echo "${a/oranges/grapes}"')

如果这个方法不生效,还可以使用下面的方案。

代码语言:javascript
复制
import subprocess

def bash_command(cmd):
    subprocess.Popen(['/bin/bash', '-c', cmd])
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档