Bash 括号扩展和 cp

Bash 括号扩展和 cp

我有这个 shell 脚本:

#!/bin/sh

src=/a/really/long/dirctory/sd65asdasd/
dest=/var/www/api

# Remove everything
# Could maybe copy it as a backup (?)
sudo rm -rf $dest

# Start building new file structure
sudo mkdir $dest
sudo chown user:user $dest
cp -R $src/bin /$src/config $src/plugins $src/src $src/webroot $dest

cp $src/composer.{json,lock,phar} $src/gulpfile.js $src/index.php $dest 

但我得到了:

cp: cannot stat '/a/really/long/dirctory/sd65asdasd/composer.{json,lock,phar}': No such file or directory

如果我直接在命令行中执行简单复制而不进行括号扩展,它可以毫无问题地运行。

有任何想法吗?

echo $BASH_VERSION  = 4.4.19(1)-release

答案1

您实际上并不是在 Bash 下运行该脚本;而是在 下运行它/bin/sh

/bin/sh 只需要提供基本的“POSIX shell”功能,因此在一个系统上可能在其他平台上可能不是。例如,Debian 几乎总是使用短跑shell 作为 /bin/sh。

dash 的目标是快速而简约;括号扩展不是标准功能,因此 Dash 不提供它(就像它不提供许多其他语法功能一样,例如数组)。

类似地,在其他发行版中,shell 可能是 busybox-ash,或者 Korn shell(实际上支持 {} 扩展),甚至是 zsh。

要实际使用 Bash,请将脚本的标题更改为#!/bin/bash#!/usr/bin/env bash

相关内容