Я хочу написать команду псевдонима для 'ls', так что если я передам параметр, то псевдоним будет использовать его, а если нет, то вместо него будет использоваться '*'. Это псевдоним у меня сегодня:
alias lsd='ls --color -lh | grep "^d" && ls --color -lh | grep -v "^d"
Моя проблема в том, что независимо от того, что я печатаю для lsd
команды, я всегда получаю все файлы в ответе. Поэтому, когда я печатаю lsd *.sh
, я все равно получаю все каталоги и файлы в списке.
Я скопировал этот псевдоним из другого поста SuperUser, но пока не совсем понял.
Спасибо за любую помощь.
ОБНОВЛЕНИЕ : Хорошо, теперь у меня есть эта функция, определенная в моем файле .bashrc:
function lsd() {
if [[ -z $1 ]] ; then
command ls --color -lh | grep "^d" && ls --color -lh | grep -v "^d"
else
command ls --color -lh "$1" | grep "^d" && ls --color -lh "$1" | grep -v "^d"
fi
}
Когда я запускаю это просто lsd
, это работает так, как я хочу. Когда я запускаю его, lsd *.wav
хотя, я все равно получаю имена каталогов в выводе, а затем вижу «Двоичный файл x.wav соответствует выводу». Что я делаю неправильно?
В случае, если это не ясно, я пытаюсь перечислить каталоги и затем файлы, но только те, которые соответствуют первому параметру в команде. Поэтому, когда я вхожу lsd *.wav
, я не ожидаю увидеть каталоги, так как их имена не заканчиваются на .wav. Спасибо за помощь! :)
ПОСЛЕДНО: Не бери в голову Я использовал исходный код .bashrc, чтобы попытаться обновить bash, но это не сработало, поэтому старые команды все еще работали. Я закрыл сеанс SSH и снова вошел в систему, и теперь эта новая команда работает. Спасибо всем!
источник
[[ -z $1 ]]
иначе, вы можете предоставить слишком много аргументов (попробуйте это:)[[ -z a b c ]]
;command ls
не используйте'ls'
'ls'
иcommand ls
?'ls'
тоже.Используйте -z, чтобы проверить, не установлена ли переменная.
источник
[ -z $1 ] && IfThereIsNoVariable || IfThereIsAVariable
это после того, как && выполнит команду, когда вы только что запустились,lsd
и после || пойдет команда, если выlsd *.sh
[ -z $1 ]
является оператором сценария оболочки. но теперь, когда я думаю об этом, вам нужно будет превратить его в другой сценарий, а затем в псевдоним этого сценария. ех.alias lsd='Path/To/Script'
затем поместите[ -z $1 ] && LsWithoutArguement || LsWithArguement
внутрь Path / To / ScriptКак уже говорили другие, «псевдоним» не обрабатывает аргументы командной строки, указанные в командной строке, которая вызывает команду «псевдоним». Он просто передает все аргументы командной строки замещенной команде, добавляя аргументы в конец.
Вот пример тестового скрипта, чтобы показать этот эффект ...
Начните с такого сценария:
Затем назначьте этот сценарий псевдониму:
Вызвать псевдоним
lsx
без аргументов:Вызвать псевдоним
lsx
с 1 аргументом"*.txt"
:Обратите внимание, что скрипт, вызванный командой «aliased», сообщает
0
аргументы вместо1
("*.txt"
) или2
("eel.txt", "fox.txt"
).Вызвать псевдоним
lsx
с 4 аргументами:Обратите внимание, что скрипт, вызываемый командой «aliased», сообщает
0
аргументы вместо4
.Итак, рабочая версия скрипта:
(Обратите внимание на
\
beforels
. Это предотвращаетls
дальнейшую замену другими «псевдонимами» и т. Д.).Назначьте рабочий сценарий псевдониму:
Вызвать псевдоним
lsx
без аргументов:Обратите внимание, что сценарий обнаружил отсутствие аргументов и запустился
"ls *"
вместо"ls"
(без аргументов).Вызвать псевдоним
lsx
с 1 аргументом"*.txt"
:Вызвать псевдоним
lsx
с 4 аргументами:Если есть причина, по которой вы хотите сделать это с «псевдонимом», это должно работать для вас. Просто дайте псевдониму и сценарию любые имена, которые вам нравятся. Например, если вы хотите «псевдоним»
ls
команды, используйтеalias ls='/some...path/ls2.sh'
(с путем и именем, которые вы использовали для сценария).С другой стороны, если вы хотите, чтобы эта команда имела уникальное имя, как,
lsx
например, было бы проще просто дать сценарию это имя и поместить сценарий в папку, которая включена в путь, например:,/bin/lsx
или как угодно тебе нравится.источник