为了简单起见,我尝试使用别名来指定一个命令:
php artisan route:list | (head -n 3; grep checkout)
该命令显示该表的标题并搜索路线。结果如下:
+--------+----------+--------------------------------------------+----------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+----------+---------------------------------------------+----------------------------------------------------+-------------------------------------------------------------------------------+------------------------------------------------------+
| | POST | profile/auctions/checkout | user-portal-profile-auctions-checkout | xxxxxxxxxxxxxxxx | web,auth |
| | POST | profile/deals/checkout | user-portal-profile-deals-checkout | xxxxxxxxxxxxxx | web,auth |
| | POST | profile/quotes/checkout | user-portal-profile-quotes-checkout | xxxxxxxxxxxxxxx | web,auth |
这就是我的~/.bash_profile
:
alias findRoute='php artisan route:list | (head -n 3; grep $1)'
但我不断收到此错误:
bash: syntax error near unexpected token `checkout'
是什么赋予了?为什么它不接受我的论点?
我尝试在我传递的参数中使用单引号和双引号。
我尝试在别名中使用单引号和双引号。没有什么变化。
答案1
别名扩展只是文本替换,然后由 shell 进行另一轮解析。
当你进入
findRoute checkout
首先扩展到:
php artisan route:list | (head -n 3; grep $1) checkout
该结果再次被解析为 shell 代码。这里的 shell 代码无效。
您可能想在此处使用脚本或函数。喜欢:
findRoute() {
php artisan route:list | {
head -n 3
grep -e "$1"
}
}
现在,请注意head
可能会读取超过 3 行,即使它只输出 3 行,因为大多数head
实现都是通过整个块读取的。这意味着grep
看不到那部分。
如果您sed
是 GNU 实现,则可以替换head -n3
为sed -u 3q
,sed
其中一次读取输入一个字节,以免读取超过第三个换行符。
或者,您可以使用awk
:
findRoute() {
php artisan route:list |
PATTERN=$1 awk 'NR <= 3 || $0 ~ ENVIRON["PATTERN"]'
}
Beware$1
然后被解释为扩展正则表达式(如 for grep -E
)而不是基本的一个(有grep
没有-E
)。对于子字符串搜索(如grep -F
),替换为:
findRoute() {
php artisan route:list |
PATTERN=$1 awk 'NR <= 3 || index($0, ENVIRON["PATTERN"])'
}