我有这个 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
您实际上并没有在 Bash 下运行脚本;你正在运行它
/bin/sh
。/bin/sh 只需要提供基线“POSIX shell”功能,因此在一个系统上它可能是 Bash,而在其他系统上可能不是。例如,Debian 几乎总是使用dash shell 作为 /bin/sh。
dash 的目标是快速和最小化;大括号扩展不是标准功能,因此 Dash 不提供它(就像它不提供许多其他语法功能,如数组)。
类似地,在其他发行版上,shell 可能是busybox-ash,或 Korn shell(它确实支持 {} 扩展),甚至是 zsh。
要实际使用 Bash,请将脚本的标题更改为
#!/bin/bash
或#!/usr/bin/env bash
。