括号扩展在 shell 脚本中不起作用

括号扩展在 shell 脚本中不起作用

我尝试在 shell 脚本中使用括号扩展来创建目录结构,但没有得到预期的效果。

使用 行sudo mkdir -pv /opt/test/{one,two,three}-way,直接向 shell 发出命令,我得到了预期的结果。如果我在脚本中有这个,它会创建一个路径opt/test/{one,two,three}-way

壳结果:

jwright@ubuntu-server:/$ sudo mkdir -pv /opt/test/{one,two,three}-way
[sudo] password for jwright: 
mkdir: created directory '/opt/test'
mkdir: created directory '/opt/test/one-way'
mkdir: created directory '/opt/test/two-way'
mkdir: created directory '/opt/test/three-way'

脚本结果:

jwright@ubuntu-server:~$ sudo sh setup.sh
[sudo] password for jwright: 
mkdir: created directory '/opt/test1'
mkdir: created directory '/opt/test1/{one,two,three}-way'

您可以从输出中看到我正在以 sudo 身份运行 shell。

答案1

使用命令sh setup.sh,您可以指示dashshell 解释脚本。shelldash是 Ubuntu 中的系统范围默认 shell,而更“重”的(甚至 bash 开发人员自己也说是“臃肿的” bashshell 用于交互式 shell(终端上的提示符)。

dash轻量级且更简约,不支持 的所有功能bash。包括括号扩展。如果您想在脚本中使用 bash 特定功能,请使用 bash 加载它:

bash setup.sh

如果你使脚本可执行,那么舍邦行用于指示哪个解释器应运行该脚本。这是脚本中的第一行,以注释形式包含:

#!/bin/bash

如果脚本可执行,则通过输入其名称来运行(/path/to/setup.sh或者./setup.sh如果脚本在当前目录中,或者仅setup.sh当脚本在系统搜索可执行文件的 PATH 中),该指令将告诉它使用 来运行bash

Shebang 线将不是如果您将脚本作为解释器的参数启动,则将获得尊重。因此,即使 shebang 行在那里,sh setup.sh仍将使用dash而不是bash

相关内容