AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 435621
Accepted
nanangarsyad
nanangarsyad
Asked: 2018-04-05 14:19:01 +0800 CST2018-04-05 14:19:01 +0800 CST 2018-04-05 14:19:01 +0800 CST

路径斜杠后的 Bash 大括号扩展

  • 772

我正在尝试使用大括号扩展将文件以不同的名称复制到同一目录中。我正在使用 bash 4.4.18。

这是我所做的:

cp ~/some/dir/{my-file-to-rename.bin, new-name-of-file.bin}

但我收到此错误:

cp: cannot stat '/home/xyz/some/dir/{my-file-to-rename.bin,': No such file or directory

即使是像这样的简单大括号扩展也会给我同样的错误:

cp {my-file-to-rename.bin, new-name-of-file.bin}

我究竟做错了什么?

bash brace-expansion
  • 3 3 个回答
  • 3001 Views

3 个回答

  • Voted
  1. Best Answer
    Eliah Kagan
    2018-04-05T14:25:01+08:002018-04-05T14:25:01+08:00

    大括号扩展语法接受逗号,但不接受逗号后的空格。在许多编程语言中,逗号后的空格很常见,但这里不是。在 Bash 中,不带引号的空格的存在会阻止执行大括号扩展。

    删除空间,它将起作用:

    cp ~/some/dir/{my-file-to-rename.bin,new-name-of-file.bin}
    

    虽然根本不需要,但请注意,您可以将尾随移动到.bin大括号之外:

    cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
    

    如果您想测试大括号扩展的效果,您可以使用echoorprintf '%s '或printf您喜欢的任何格式字符串来执行此操作。echo(当我在 Bash 中时,我个人只是使​​用它,因为Bash 的echo内置默认情况下不会扩展转义序列,因此非常适合检查实际运行的命令。)例如:

    ek@Io:~$ echo cp ~/some/dir/{my-file-to-rename,new-name-of-file}.bin
    cp /home/ek/some/dir/my-file-to-rename.bin /home/ek/some/dir/new-name-of-file.bin
    
    • 31
  2. ilkkachu
    2018-04-05T14:27:51+08:002018-04-05T14:27:51+08:00

    string{foo, bar}不是大括号扩展;这是两个词string{foo,和bar}。要使用大括号扩展,大括号必须在同一个单词内。如果不需要,则必须删除多余的空间,如果确实需要,则必须引用它:

    $ printf "%s\n" aa{bb, cc}
    aa{bb,
    cc}
    $ printf "%s\n" aa{bb,cc}
    aabb
    aacc
    $ printf "%s\n" aa{bb," cc"}
    aabb
    aa cc
    
    • 24
  3. cde
    2018-04-05T18:59:04+08:002018-04-05T18:59:04+08:00

    Bash 像对待任何其他空间一样对待该空间。作为 IFS,内部场分离器。这用于扩展后的分词,并使用 read 内置命令将行拆分为单词。

    Shell 将 IFS 的每个字符视为分隔符,并将其他扩展的结果拆分为这些字符上的单词。如果 IFS 未设置,或者它的值恰好是默认值,则忽略先前扩展结果的开头和结尾处的 、 和 序列,并且不在开头或结尾处的任何 IFS 字符序列用于分隔字。如果 IFS 的值不是默认值,则在单词的开头和结尾处忽略空格字符 space 和 tab 的序列,只要空格字符在 IFS 的值中(IFS 空格字符)。IFS 中不是 IFS 空白的任何字符,以及任何相邻的 IFS 空白字符,都会分隔一个字段。IFS 空白字符序列也被视为分隔符。如果 IFS 的值为空,
    -bash(1)

    通过插入分隔符,未转义,然后您告诉 bash 您的命令和参数是:

    1. “cp”
    2. "~/some/dir/{my-file-to-rename.bin,"
    3. “文件的新名称.bin}”

    如果您有引号或转义“\”,您将:

    1. “cp”
    2. “~/some/dir/{my-file-to-rename.bin,\new-name-of-file.bin}”

    这也不是您想要的,除非“new-name-of-file.bin”是您想要的新文件名。包括空间。由于大括号扩展首先发生,然后是波浪号扩展,bash 将执行:

    1. “cp”
    2. “/path/to/home/some/dir/my-file-to-rename.bin”
    3. “/path/to/home/some/dir/\ new-name-of-file.bin”

    只需删除空间即可解决所有问题。

    • -1

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve