Почему эта функция bash не работает?

Я хочу сделать функцию ярлыка для ls -rt, но -rt не принимается Unix в моем определении. Почему это не работало? Каково решение?

lsr () {ls -rt $1;}

Ответ 1

Ваша конкретная проблема заключается в том, что вам нужно свободное пространство после открывающей скобки, например (правильно цитировать и использовать все аргументы)

lsr() { ls -rt "[email protected]"; }

Но вы также можете рассмотреть псевдоним, поскольку это замена в начале команды:

alias lsr='ls -rt'

В конце концов, сколько систем дает вам очень "длинный ls", с чем-то вроде:

alias ll='ls -al'

Вам просто нужно убедиться, что это присутствует в том, что требовалось для конкретных случаев по мере необходимости, например, в .bashrc для интерактивных оболочек или в файле, полученном в начале вашего самого script (и обеспечение псевдонимов расширяется с помощью shopt -s expand_aliases). Это две возможности, но, несомненно, другие.

Ответ 2

добавить пробелы после {

lsr () { ls -rt $1;}

Ответ 3

Это может быть недостающее пространство после первого "{"?

# 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

Ответ 4

Как уже отмечалось, { должно сопровождаться пробелом для определения функции.

shellcheck.net - отличный сайт для проверки синтаксиса кода оболочки, который будет иметь проблема:

lsr () {ls -rt $1;}
        ^-- SC1054: You need a space after the '{'.
               ^-- SC2086: Double quote to prevent globbing and word splitting.

Как вы можете видеть, он не только нашел проблему, но также предложил полезное предложение для двойной кавычки $1, чтобы заставить аргумент работать с именами файлов со встроенными пространствами и символами glob.

Что касается , почему требуется пробел после {:

{ - это экземпляр так называемого ключевого слова оболочки, в отличие от так называемых метасимволов оболочки | & ; ( ) < > space tab.

Метасимволы разделяют слова во время разбора, ключевые слова - нет.

В данном случае { в {ls не распознается как ключевое слово оболочки, потому что оно не распознается как отдельное слово из-за немедленного выполнения ls.

Bash поэтому видит одно слово {ls, что неожиданно в этом положении, и корректно сообщает syntax error near unexpected token '{ls'.

Обратите внимание, что закрытие } не требует предшествующих пробелов (даже если вы можете добавить его для визуальной симметрии), потому что ему предшествует метасимвол ;, который по определению считается его "собственной вещью", и, следовательно, неявно вызывает распознавание } как своего собственного слова.

Относительно примечания: Поскольку закрытие } находится в той же строке, что и команда ls, команда ls должна быть прервана с помощью оператора управления ; - в противном случае } будет интерпретироваться как еще один аргумент ls.