linux - 无法为我的 .bashrc 实现别名/替换功能
问题描述
我正在尝试为我的 find 命令着色,因此我已将此别名函数添加到我的 .bashrc 中。
# liberate your find
function find
{
command find $@ -exec ls --color=auto -d {} \;
}
但是使用此代码会出现意外行为。它放弃了我的报价。
GNU bash,版本 4.4.23(1)-release (x86_64-pc-linux-gnu)
使用我的功能:
find ./ -name '*.pl' -or -name '*.pm'
结果:
./lib/cover.pm
./lib/db.pm
使用相同的 find 函数但内置:
command find ./ -name '*.pl' -or -name '*.pm'
结果:
./auth.pl
./index.pl
./title.pl
./lib/cover.pm
./lib/db.pm
./fs2db.pl
所以第二个变种并没有吃掉我的报价,而是按照它应该的方式工作。
解决方案
为了重现问题,我创建了所有文件,如问题中较长的结果所示。
当我将函数(*)定义为
function find
{
command find $@ -exec ls --color=auto -d {} \;
}
并执行
find ./ -name '*.pl' -or -name '*.pm'
我收到一条错误消息
find: paths must precede expression: fs2db.pl
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]
因为被shell*.pl
扩展为。auth.pl fs2db.pl index.pl title.pl
我不得不将功能更改为
function find
{
command find "$@" -exec ls --color=auto -d {} \;
}
重现您的问题。(也许这取决于外壳。我用 bash 4.4.19(3)-release 进行了测试)
在set -x
你可以看到 shell 在执行你的函数时做了什么之后:
$ find ./ -name '*.pl' -or -name '*.pm'
+ find ./ -name '*.pl' -or -name '*.pm'
+ command find ./ -name '*.pl' -or -name '*.pm' -exec ls --color=auto -d '{}' ';'
+ find ./ -name '*.pl' -or -name '*.pm' -exec ls --color=auto -d '{}' ';'
./lib/cover.pm
./lib/db.pm
执行你的函数和直接执行命令的区别在于你的函数使用隐式(AND) 运算符find
附加一个动作。没有显式操作,打印所有匹配的结果。-exec
-a
find
您会看到运算符优先级-a
(AND) 高于-o
(= -or
, OR)的结果
您可以比较这 3 个命令的输出
command find ./ -name '*.pl' -or -name '*.pm'
command find ./ -name '*.pl' -or -name '*.pm' -print
command find ./ \( -name '*.pl' -or -name '*.pm' \) -print
见http://man7.org/linux/man-pages/man1/find.1.html#NON-BUGS
您可以将您的功能称为
find ./ \( -name '*.pl' -or -name '*.pm' \)
以避免问题。
(*)此函数定义是从问题中复制而来的。
您应该改用可移植的 POSIX 样式find() { ... }
,除非对 Korn shell 样式有特定要求function find { ... }
。
推荐阅读
- python - 用于 Tesseract OCR 的带有眩光的 OpenCV 预处理图像
- javascript - 在 mouseup-event 中使用 mousedown-position
- android - 错误:null,无法在单个 dex 文件中容纳请求的类(# 方法:66384 > 65536)
- .net - VB.NET 总是给出一个 closereason 作为用户关闭
- python - Python - 使用 Python 参数对查询应用过滤器
- reactjs - 是否可以在 ReactJS 中从一个页面导航到另一个页面的导航栏的组件?
- python - django中密码错误可以访问数据库
- php - 共享 php 文件上的 include_once 间歇性错误
- python - 覆盖 BaseHTTPRequestHandlerClass
- asp.net - Silverlight 5.1 应用程序在移动到新服务器时中断