Bash: переопределение ls -la с помощью ls -la | больше (основная проблема скриптов bash)

2009
sixtyfootersdude

Довольно плохо знаком с 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 } 
0

3 ответа на вопрос

4
GreenMatt

I realize this isn't exactly what you're asking about, but I mention it in case you've not thought about this sort of solution. In my experience, the usual way to work around this is to make an alias without a space, e.g.:

alias llm="ls -la | more" 

This is a lot quicker and easier than writing a script. FWIW, I tested this on a FreeBSD 5.3 system running Bash 3.0 and it provided a listing run through more.

Спасибо за комментарий. Думал об этом, но предпочитаю сценарий решения. sixtyfootersdude 14 лет назад 0
1
njd

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

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

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

uname -a bash --version 
Работает солярис 10 с такой же башкой как у тебя. Я предположил, что это была просто ошибка с пробелами или что-то в этом роде. Или, может быть, скобки. Вы делали прямую копию моего кода? И это сработало? Спасибо за помощь! sixtyfootersdude 14 лет назад 0
Да, я скопировал и вставил его точно в мой .bashrc, удалил номера строк, и об ошибке не сообщалось. njd 14 лет назад 1
очень странно .. Понятия не имею, что говорит об ошибке? sixtyfootersdude 14 лет назад 0
Хорошо, это в основном работает сейчас. Выражение if когда-либо оценивалось как верное для вас? То есть: сделал `ls -la | больше когда-нибудь казнить? sixtyfootersdude 14 лет назад 0
ХА! У меня есть псевдоним, который берет ls и отображает его в ls -F, и это все испортило. Задача решена. sixtyfootersdude 14 лет назад 0
D'о! Самые простые решения всегда самые лучшие. Приятно знать, что ты все исправил. njd 14 лет назад 0
1
SuperMagic

заменить:

 функция лс { если [[$ @ == "-la"]] затем эхо "тест" / bin / ls -la | Больше еще / bin / ls "$ @" Fi;  } 

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

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

Я почти уверен, что именно это делает ключевое слово command? sixtyfootersdude 14 лет назад 0
Использование команды 'command' (!) Предотвращает поиск функции / псевдонима. njd 14 лет назад 1
@njd: спасибо за разъяснения. sixtyfootersdude 14 лет назад 0

Похожие вопросы