Я хочу сделать функцию ярлыка для ls -rt
, но -rt
не принимается Unix в моем определении. Почему это не работало? Каково решение?
lsr () {ls -rt $1;}
Я хочу сделать функцию ярлыка для ls -rt
, но -rt
не принимается Unix в моем определении. Почему это не работало? Каково решение?
lsr () {ls -rt $1;}
Ваша конкретная проблема заключается в том, что вам нужно свободное пространство после открывающей скобки, например (правильно цитировать и использовать все аргументы)
lsr() { ls -rt "[email protected]"; }
Но вы также можете рассмотреть псевдоним, поскольку это замена в начале команды:
alias lsr='ls -rt'
В конце концов, сколько систем дает вам очень "длинный ls", с чем-то вроде:
alias ll='ls -al'
Вам просто нужно убедиться, что это присутствует в том, что требовалось для конкретных случаев по мере необходимости, например, в .bashrc
для интерактивных оболочек или в файле, полученном в начале вашего самого script (и обеспечение псевдонимов расширяется с помощью shopt -s expand_aliases
). Это две возможности, но, несомненно, другие.
добавить пробелы после {
lsr () { ls -rt $1;}
Это может быть недостающее пространство после первого "{"?
# 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
Как уже отмечалось, {
должно сопровождаться пробелом для определения функции.
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
.