我有这个 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
。