gpt4 book ai didi

linux - 当我尝试使用 sh `echo ' rm -rf 中的 bash 时出现语法错误!(食谱 )' | bash`

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:23:40 27 4
gpt4 key购买 nike

当我使用/bin/sh 时,我可以简单地通过回显来通过 bash 发出命令

vagrant@vagrant:~$ sh
$ echo 'ls' | bash
some.sh

但是当我尝试使用这个命令时 rm -rf !(cookbooks) 我明白了

$ echo 'rm -rf !(cookbooks)' | bash
bash: line 1: syntax error near unexpected token `('
bash: line 1: `rm -rf !(cookbooks)'

我需要从/bin/sh 发出这个命令。

来自打包机的@anubhava http://www.packer.io/提供脚本

if [ -d "/opt/chef/chef-solo/" ]; then
cd /opt/chef/chef-solo
rm -rf !(cookbooks)
fi

最佳答案

!(cookbooks) 是一个 extglob。默认情况下不启用它们;您需要在前面的 bash 行中运行 shopt -s extglob(因为解析器逐行运行)以使其有效。

所以:

printf '%s\n' 'shopt -s extglob' 'rm -rf !(cookbooks)' | bash

...或者您可以通过命令行启用 extglobs(感谢 chepner 的附录):

echo 'rm -rf !(cookbooks)' | bash -O extglob

顺便说一下,可以在 POSIX sh 中执行此操作,而无需使用 extglobs。例如:

# wrap in a function to have a separate $@ rather than overriding global
delete_all_but_cookbooks() {
set --
for f in *; do
[ "$f" = "cookbooks" ] || set -- "$@" "$f"
done
rm -rf "$@"
}
delete_all_but_cookbooks

...或者,更简单,只使用查找:

find . -mindepth 1 -maxdepth 1 -name cookbooks -prune -o -exec rm -rf '{}' +

关于linux - 当我尝试使用 sh `echo ' rm -rf 中的 bash 时出现语法错误!(食谱 )' | bash`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21584303/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com