为什么这个bash功能不起作用?

时间:2016-06-14 02:53:43

标签: bash unix

我想为ls -rt创建快捷函数,但在我的定义中,Unix不接受-rt。为什么这不起作用?解决方案是什么?

lsr () {ls -rt $1;}

4 个答案:

答案 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

因此,Bash会看到单个词{ls,这个位置出乎意料,并且恰当地报告了syntax error near unexpected token '{ls'

请注意,结束} 需要在空格之前(即使您可能希望将其添加到 visual 对称),因为它是前面有元字符; ,根据定义,它被识别为&#34;自己的东西&#34;,因此隐含地导致}被识别为它自己的单词。< / p>

在相关说明中:由于结束}ls命令位于同一行,因此ls命令必须被控制操作符;终止 - 否则,}将被解释为另一个参数ls