gpt4 book ai didi

macos - cd 到 bash 脚本中以波浪号 (~) 开头的文件夹名称

转载 作者:行者123 更新时间:2023-12-02 08:32:07 28 4
gpt4 key购买 nike

我正在尝试创建一个非常简单的 bash 脚本来执行以下操作:

  • 输入用户进入项目文件夹
  • 设置输入变量的值
  • cd 到输入的文件夹
  • 删除readme.md文件

根据我所阅读的内容,我得出了这个结论:

#!/bin/bash

echo "Enter the project folder path:"
read -e DESTINATION_FOLDER

cd "$DESTINATION_FOLDER"
rm -rf "$DESTINATION_FOLDER/readme.md"

我输入的文件夹路径是

~/Dropbox/myproject

我得到的错误是下面的错误。但是该文件夹存在,我可以使用 cd 命令手动访问它。

./cleanup.sh: line 6: cd: ~/Dropbox/myproject/: No such file or directory

谁能指出我做错了什么?

最佳答案

波浪号 (~) 仅在直接出现(且未被引用)时才扩展到主目录。当您使用 cd "$DESTINATION_FOLDER" 时,$DESTINATION_FOLDER 中的字符按字面意思使用,包括开头的 ~。即使您使用了 cd $DESTINATION_FOLDER~ 也会被直接插入,尽管 $DESTINATION_FOLDER 中的空格和 glob 元字符会被扩展.所以真的没有办法对变量中的值进行波浪号扩展。 [注1]

有些人会建议使用eval,但您必须非常小心。如果 $DESTINATION_FOLDER 包含 shell 元字符,eval cd "$DESTINATION_FOLDER" 可能会产生意外结果。例如,考虑以下内容(不要在包含您关心的文件的目录中尝试此操作):

$ mkdir -p ~/tmp/foo && cd ~/tmp/foo
$ touch a few files
$ ls
a few files
$ x="~/tmp/foo;rm *"
$ # BEWARE!
$ eval cd "$x"
$ # OOPS!
$ ls
$

正确的做法是自己扩展波浪号:

cd "${DESTINATION_FOLDER/#~/$HOME}"

bash 中,${var/pattern/replacement} 根据 $var 的值生成一个字符串,其中第一个实例pattern(如果有)被替换为replacement。如果 pattern 出现在 $var 的开头,则 ${name/#pattern/replacement} 形式只会进行替换。 pattern 是一个 glob,而不是正则表达式。

编辑:在评论中,Tom Fenech建议如果可以处理 ~user 以及 ~ 会很酷。同样,处理像 ~+2 [注 2] 这样的 bashisms 会更酷。

的确如此。不幸的是,bash 没有提供波浪号扩展的内置函数。或任何其他类型的扩展。所以我认为有必要使用eval,但是这需要相当谨慎,如上所述。我认为最好的办法是仅在波浪号前缀不包含元字符时提取波浪号前缀,然后才使用 eval printf %s 展开它,如下所示:

tilde-expand() {
(
shopt -s extglob
if [[ $1 =~ ^~[[:alnum:]_.+-]*(/.*)?$ ]]; then
printf %s "$(eval printf ${1%%/*})${1##*([^/])}"
else
printf %s "$1"
fi
)
}

(以上内容尚未经过仔细测试。与往常一样,应谨慎对待 eval,因此请在部署前仔细检查。)


注意事项:

  1. 一般来说,这无关紧要,因为大多数脚本将输入作为参数而不是从控制台读取它们。这样的脚本可以写成如下:

    cdrm() {
    cd "$1" && rm -rf readme.md
    }

    然后您就可以使用波浪号调用它了:

    cdrm ~/Dropbox/myproject/

    因为 ~ 会在 cdrm 的调用中被扩展,所以 $1 将具有扩展后的值。

  2. 我从未使用过 ~+N 波浪线扩展,但可能有人认为它们必不可少

关于macos - cd 到 bash 脚本中以波浪号 (~) 开头的文件夹名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25594495/

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