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

➜  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 却可以支持函数中的中横线。

➜  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 参数,示例如下:

import subprocess

def bash_command(cmd):
subprocess.Popen(cmd, shell=True, executable='/bin/bash') bash_command('a="Apples and oranges" && echo "${a/oranges/grapes}"')

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

import subprocess

def bash_command(cmd):
subprocess.Popen(['/bin/bash', '-c', cmd])

参考资料

  1. Python subprocess.Popen documentation
  2. How to use the bash shell with Python's subprocess module install of /bin/sh
  3. Are there problems with hyphens in functions, aliases, and executables?

Shell 函数带中横线问题排查的更多相关文章

  1. 带中横线的日期格式在iOS手机系统上 转换时间戳NaN问题

    类似于 '2019-04-01 14:13:00' 这样的日期格式转换时间戳在iOS手机上是无法转换的,需要先处理日期格式成 '2019/04/01 14:13:00' var str = '2019 ...

  2. Shell编程-09-Shell中的函数

    目录 基本语法 函数执行 函数示例     函数可以简化程序的代码量,达到更好的代码复用度,因此会让程序变得更加易读.简洁和易修改.其作用就是将需要多次使用的代码整合到一块,使其成为一个整体,然后通过 ...

  3. 使用shell调用python中的函数

    最近遇到一个需求,需要通过shell调用python中的一个函数,发现其实也挺简单的: python脚本如下: test.py: import ConfigParser config = Config ...

  4. js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快、简单 post:安全,量大,不缓存)(服务器同步和异步区别:同步:等待服务器响应当中浏览器不能做别的事情)(ajax和jquery一起用的)

    js中ajax连接服务器open函数的另外两个默认参数get请求和默认异步(open的post方式send函数带参数)(post请求和get请求区别:get:快.简单 post:安全,量大,不缓存)( ...

  5. shell 从函数文件中调用函数的方法

    你可以把所有的函数存储在一个函数文件中 你可以把所有的文件函数加载到当前脚本或命令行 加载函数文件中所有函数的方法: source xxx.sh

  6. shell函数-3

    1.shell函数 1.1.shell函数定义 对于重复出现的代码,在shell中可以定义函数,然后在指定的地方调用即可.便于代码复用,提高开发效率. 定义函数的语法如下: function 函数名( ...

  7. shell 函数用法

    近期在学习shell编程方面的知识,写的不怎么好,请大家多多指点,下面给大家分享一下shell函数的用法. 我们为什么要用shell函数? 简单的说,函数的作用就是把程序多次调用相同的代码部分定义成一 ...

  8. Shell脚本笔记(五)Shell函数

    Shell函数 1.定义语法 标准写法: funciton funName () { order....... return n } 简化写法1: funciton funName { order.. ...

  9. shell函数与数组

    shell函数与数组 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么要使用shell函数 简单的说函数的作用就是把程序里多次调用的相同的代码部分定义成一份,然后起个名字, ...

随机推荐

  1. markdown mermaid序列图

    序列图(时序图) 序列图是一种交互图,它显示了进程如何相互操作以及按什么顺序操作. sequenceDiagram participant l as 大灰狼 participant y as 小羊 l ...

  2. 带你读AI论文丨RAID2020 Cyber Threat Intelligence Modeling GCN

    摘要:本文提出了基于异构信息网络(HIN, Heterogeneous Information Network)的网络威胁情报框架--HINTI,旨在建模异构IOCs之间的相互依赖关系,以量化其相关性 ...

  3. STC8H开发(五): SPI驱动nRF24L01无线模块

    目录 STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解) STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解) ST ...

  4. Go 指针,标识符命名规范及关键字

    #### Go 指针,标识符命名规范,关键字,运算符回顾了一下之前写的文章,以及考虑到后期的内容较多, 从这篇开始逐渐增加文章内容; 这篇我们主要学习一Go 中的指针,标识符关键字以及运算符##### ...

  5. jetson-nano opencv基础使用

    前言: jetson nano前一篇给大家介绍了学习的一些思路和资料,今天继续给大家分享一篇在jetson nano使用opencv的文章. OpenCV的全称是Open Source Compute ...

  6. HCNP Routing&Switching之组播技术-IGMP-Snooping

    前文我们了解了组播协议IGMP相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15700550.html:今天我们来聊一聊二层交换机处理组播报文所面临的 ...

  7. C#Xml的三种创建方式(或者是两种?)和增删改查

    一.Xml的创建方式 Xmlwriter(流式读取,Stream) 写过了:https://www.cnblogs.com/dengzhekaihua/p/15438493.html 这种方法虽然快, ...

  8. Java中class的前面添加public和不添加public有什么区别?

    需要知道的是修饰类和变量的用来控制这个被修饰的类和变量的适用范围的修饰词有: 1.public:表示公开的类和变量,既所有的类都可以引入使用的. 2.protected:表示受保护的类,只有子孙类和本 ...

  9. JAVA多线程学习十一-线程锁技术

    前面我们讲到了synchronized:那么这节就来将lock的功效. 一.locks相关类 锁相关的类都在包java.util.concurrent.locks下,有以下类和接口: |---Abst ...

  10. 让HTML和JSP页面不缓存从Web服务器上重新获取页面

    感谢原文作者:佚名 原文链接:https://www.jb51.net/web/100639.html 问题描述 用户退出后,如果点击浏览器上的后退按钮,Web应用将不能正确保护受保护的页面--在Se ...