Shell 函数带中横线问题排查

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
</code></pre>
<p>根据 POSIX 的标准,函数名要符合以下的规范。</p>
<blockquote>
<p><strong>3.231 Name</strong>
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.</p>
</blockquote>
<p>可以看到,中横线不在标准支持的范围内。因此使用 <code>/bin/sh</code> 执行时,会看到我们上面列出的错误。</p>
<p>但是 <code>bash</code> 和 <code>zsh</code> 却可以支持函数中的中横线。</p>
<pre><code class="language-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
➜  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])

参考资料

Original: https://www.cnblogs.com/cocowool/p/shell-function-with-hyphen.html
Author: Cocowool
Title: Shell 函数带中横线问题排查

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/529579/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • vnc复制粘贴与禁止

    1.ubuntu服务器中安装了vncserver,启动服务。在另外一台机器上访问服务器,可以在服务器终端中执行vncconfig -nowin&(或者vncconfig&a…

    Linux 2023年6月13日
    097
  • Web开发静态资源处理

    Web开发静态资源处理 7.1 静态资源处理 我们要引入前端资源,项目中有许多的静态资源,比如css,js等文件,这个SpringBoot是怎么处理呢? 如果我们是一个web应用,…

    Linux 2023年6月14日
    0117
  • Django基础学习笔记

    创建一个django项目:命令: django-admin startproject 项目名 进入到项目并创建一个应用:命令: python manage.py startapp …

    Linux 2023年6月6日
    097
  • 线程池如何保证核心线程一直存活

    转载请注明出处: 查看 ThreadPoolExecutor 类中的 getTask 方法,这个方法可以保持核心线程在没有任务的时候也可以一直处于存活状态 核心在于 workQue…

    Linux 2023年6月14日
    0163
  • 基于AnolisOS8.6安装OceanBase数据库

    网络配置 cd /etc/sysconfig/network-scripts/ ls vi ifcfg-ens33 修改网络配置 TYPE=Ethernet PROXY_METHO…

    Linux 2023年6月7日
    0109
  • 剑指offer计划31(数学困难)—java

    1.1、题目1 剑指 Offer 14- II. 剪绳子 II 1.2、解法 刚刚好结束了,这个专题,国庆休息,后面再改 1.3、代码 class Solution { publi…

    Linux 2023年6月11日
    0105
  • SSH 完全教程 2

    SSH 默认采用密码登录,这种方法有很多缺点,简单的密码不安全,复杂的密码不容易记忆,每次手动输入也很麻烦。密钥登录是b比密码登录更好的解决方案。 密钥是什么 密钥(key)是一个…

    Linux 2023年6月7日
    074
  • 关于最近公司一个业务系统的性能优化方案

    一个刚上线的IT系统,往往负载压力不大,所以不会存在什么性能问题。这时,人们大多只关心系统的功能性和用户体验。但是,随着时间推移,用户量和数据量都比刚上线的时候要多很多,高并发和大…

    Linux 2023年6月6日
    0102
  • bash shell相关知识

    shell与bash 什么是shell ——以上图片摘自《鸟哥的Linux私房菜》 系统核心不能随意地被操作,所以就设计出了壳程序shell,一方面保护了系统核心,另一方面提供了人…

    Linux 2023年6月7日
    0121
  • rocketmq高可用集群部署(RocketMQ-on-DLedger Group)

    编辑broker的配置文件 第一台主机node0的配置(192.168.0.218): vim ./conf/dledger/broker-n0.conf 内容如下: broker…

    Linux 2023年6月8日
    0110
  • Windows Server 新增磁盘处于脱机状态解决办法

    解决方案: Cmd命令行操作如下: 1,进入diskpart模式 2、列出磁盘情况 3、选择脱机的磁盘 4、联机磁盘 5、清除磁盘属性 6、进入磁盘管理,提示初始化 每天记录一点,…

    Linux 2023年6月8日
    0113
  • shell xargs技巧

    find /home/tomcat8-hk/ -name ‘808*.sh’ | xargs -i sed ‘s@CATALINA_HOME=&…

    Linux 2023年5月28日
    0108
  • 学习c语言时对一些疑问的测试

    include int main(){/ 1 /// int a[3][3]={6,1,2,3,4,5};// int p=&a[0][0];// printf(&#822…

    Linux 2023年6月6日
    089
  • shell脚本字符串截取方法整理

    首先先声明一个变量str,下面演示以该变量为例: str=’https://www.baidu.com/about.html’ 1.#号截取,删除左边字符,保留右边字符 echo …

    Linux 2023年5月28日
    082
  • 面试题:Java序列化与反序列化

    序列化和反序列化的概念 应用场景? 序列化实现的方式 继承Serializable接口,普通序列化 继承Externalizable接口,强制自定义序列化 serialVersio…

    Linux 2023年6月6日
    0126
  • shell 配置文件节约空间

    shell 配置文件节约空间 sed 读取一个配置文件的的多个变量 Original: https://www.cnblogs.com/hshy/p/16451927.htmlAu…

    Linux 2023年5月28日
    088
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球