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. Благодарю.
но я все еще получаю ту же ошибку. Я думаю, что основная проблема может быть в том, что она находится в файле 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 ответа на вопрос
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