我想为ls -rt
创建快捷函数,但在我的定义中,Unix不接受-rt
。为什么这不起作用?解决方案是什么?
lsr () {ls -rt $1;}
答案 0 :(得分:4)
你的特殊问题是在开始大括号后需要空格,例如(正确引用并使用所有参数)
lsr() { ls -rt "$@"; }
但您可能还想考虑一个别名,因为这是在命令开头的替换:
alias lsr='ls -rt'
毕竟,这是多少系统为您提供非常方便的" long ls",其中包括:
alias ll='ls -al'
您只需要确保在需要时针对特定情况调用的内容中存在,例如在交互式shell的.bashrc
中或在开始时源自的文件中您的脚本本身(并确保使用shopt -s expand_aliases
扩展别名)。这是两种可能性,但毫无疑问是其他的。
答案 1 :(得分:2)
在{
lsr () { ls -rt $1;}
答案 2 :(得分:2)
这可能是第一次" {" ?
# bash --version
GNU bash, version 4.3.42(1)-release (i686-pc-linux-gnu)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
#
# touch a
# touch b
# touch c
# ls -rt
a b c
# ls -t
c b a
#
# lsr() {ls -rt;}
bash: syntax error near unexpected token `{ls'
# lsr() { ls -rt;}
# lsr
a b c
答案 3 :(得分:2)
正如已经指出的那样, {
必须后面跟空白 才能使函数定义生效。
shellcheck.net 是一个用于语法检查shell代码的绝佳网站,会遇到问题:
lsr () {ls -rt $1;}
^-- SC1054: You need a space after the '{'.
^-- SC2086: Double quote to prevent globbing and word splitting.
正如你所看到的,它不仅找到了问题,而且还提供了一个有用的建议来引用$1
,以便使参数适用于带有嵌入空格和glob字符的文件名。
至于 为什么需要{
之后的空格:
{
是所谓的 shell关键字的实例,而不是所谓的 shell元字符 | & ; ( ) < > space tab
强>
元字符单独的单词,关键字不。
在目前的情况下,{
中的{ls
不被识别为shell关键字,因为它未被识别为分开单词由于紧跟ls
。
{ls
,这个位置出乎意料,并且恰当地报告了syntax error near unexpected token '{ls'
。
请注意,结束}
不需要在空格之前(即使您可能希望将其添加到 visual 对称),因为它是前面有元字符;
,根据定义,它被识别为&#34;自己的东西&#34;,因此隐含地导致}
被识别为它自己的单词。< / p>
在相关说明中:由于结束}
与ls
命令位于同一行,因此ls
命令必须被控制操作符;
终止 - 否则,}
将被解释为另一个参数到ls
。