Довольно плохо знаком с bash-скриптингом. Попытка переопределить команду ls -la, чтобы быть: ls -la | Больше

(Кажется более полезным для меня).

Я добавил это в конец моего .bashrc .

154 # alias 'ls -la'='ls -la | more'
155         # this did not work because aliases
156         # are not allowed to have spaces in
157         # them. => have to make function:
158 ls() {
159         if [[ $@ == "-la" ]];
160         then
161                echo "test";
162                 command ls -la | more;
163         else
164                 command ls "$@";
165         fi;
166 }

Но я получаю эту ошибку при открытии нового терминала:

bash: /users/me/.bashrc: line 158: syntax error near unexpected token `('
bash: /users/me/.bashrc: line 158: `ls() {'

Когда я добавляю function перед ls() { нет жалоб, но нет изменений в поведении ls. Благодарю.

Обновить

Пытаясь сузить проблему, я сделал это:

159 ls() {
160         #if [[ $@ == "-la" ]];
161        # then
162                echo "test"
163 #               command ls -la | grep vim;
164         #else
165         #        command ls "$@";
166         #fi;
167 }

но я все еще получаю ту же ошибку. Я думаю, что основная проблема может быть в том, что она находится в файле bashrc?

Обновить

Странно это работает

159 function ls() {
160         #if [[ $@ == "-la" ]];
161        # then
162                echo "test"
163 #               command ls -la | grep vim;
164         #else
165         #        command ls "$@";
166         #fi;
167 }

3 ответа3

4

Я понимаю, что это не совсем то, о чем вы спрашиваете, но я упоминаю об этом на случай, если вы не подумали о подобном решении. По моему опыту, обычный способ обойти это сделать псевдоним без пробела, например:

alias llm="ls -la | more"

Это намного быстрее и проще, чем написание сценария. FWIW, я проверил это на системе FreeBSD 5.3, работающей под Bash 3.0, и это дало листинг, пробежавший больше.

1

Я не могу воспроизвести это на Bash-3.00.16 на Solaris 10 или Cygwin, но похоже, что ваш bash анализирует строку 158 как вызов команды ls , а не как определение функции.

Префикс "function" является необязательным, но если он заставляет ваш bash принять определение, то это разумный обходной путь. Это никак не меняет смысла функции.

Кстати, какую версию ОС и Bash вы используете?

uname -a
bash --version
1

заменить:

 function ls
 {
         if [[ $@ == "-la" ]]
         then
                echo "test"
                /bin/ls -la | more
         else
                /bin/ls "$@"
         fi;     
}

Примечание: вам нужно будет ссылаться на абсолютный путь к фактической команде ls внутри if или, которая будет повторно вызывать ту же функцию и .... stackoverflow! :-)

РЕДАКТИРОВАТЬ: Да, ключевое слово команды является лучшим способом предотвращения поиска псевдонимов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .