首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >find -exec basename {} vs find -exec echo $(basename {})

find -exec basename {} vs find -exec echo $(basename {})
EN

Stack Overflow用户
提问于 2017-02-17 03:45:43
回答 2查看 2.4K关注 0票数 3

我确定我漏掉了什么,但我想不出来。给定:

代码语言:javascript
复制
$ find -type f
./hello.txt
./wow.txt
./yay.txt

为什么接下来的两个命令呈现不同的结果?

代码语言:javascript
复制
$ find -type f -exec basename {} \;
hello.txt
wow.txt
yay.txt

$ find -type f -exec echo $(basename {}) \;
./hello.txt
./wow.txt
./yay.txt
EN

回答 2

Stack Overflow用户

发布于 2017-02-17 03:58:33

$(basename {})在命令运行之前进行评估。结果是{},因此命令echo $(basename {})变成echo {},并且basename不是针对每个文件运行的。

票数 3
EN

Stack Overflow用户

发布于 2017-02-17 03:56:47

使用bash -x调试器的快速调试演示了这一点,

该示例是我自己的,仅用于演示目的

代码语言:javascript
复制
bash -xc 'find -type f -name "*.sh" -exec echo $(basename {}) \;'
++ basename '{}'
+ find -type f -name '*.sh' -exec echo '{}' ';'
./1.sh
./abcd/another_file_1_not_ok.sh
./abcd/another_file_2_not_ok.sh
./abcd/another_file_3_not_ok.sh

对于basename {}来说

代码语言:javascript
复制
bash -xc 'find -type f -name "*.sh" -exec basename {} \;'
+ find -type f -name '*.sh' -exec basename '{}' ';'
1.sh
another_file_1_not_ok.sh
another_file_2_not_ok.sh
another_file_3_not_ok.sh

正如您在第一个示例中看到的,echo $(basename {})分两步解析,basename {}只是实际文件(输出纯文本文件名)上的basename,然后被解释为echo {}。因此,它只是模仿了在exec中使用findecho文件时的行为

代码语言:javascript
复制
bash -xc 'find -type f -name "*.sh" -exec echo {} \;'
+ find -type f -name '*.sh' -exec echo '{}' ';'
./1.sh
./abcd/another_file_1_not_ok.sh
./abcd/another_file_2_not_ok.sh
./abcd/another_file_3_not_ok.sh
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42283246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档