![括号扩展在 shell 脚本中不起作用](https://linux22.com/image/1195309/%E6%8B%AC%E5%8F%B7%E6%89%A9%E5%B1%95%E5%9C%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我尝试在 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
,您可以指示dash
shell 解释脚本。shelldash
是 Ubuntu 中的系统范围默认 shell,而更“重”的(甚至 bash 开发人员自己也说是“臃肿的” bash
shell 用于交互式 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
。