Как написать псевдоним для использования первого параметра или *, если параметр пуст?

2

Я хочу написать команду псевдонима для '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 и снова вошел в систему, и теперь эта новая команда работает. Спасибо всем!

Питер
источник

Ответы:

4

Псевдонимы не принимают параметры. Используйте псевдоним, если вы хотите заменить только длинную строку на короткую. Для обработки параметров используйте функцию:

ls () {
    if [[ -z $1 ]] ; then
        command ls *
    else
        command ls "$@"
    fi
}
choroba
источник
2 вещи: используйте [[ -z $1 ]]иначе, вы можете предоставить слишком много аргументов (попробуйте это:) [[ -z a b c ]]; command lsне используйте'ls'
Гленн Джекман
Теперь я смущен. Что Солоуки говорит мне тогда неправильно? Кажется, он предлагает мне использовать параметр в моей команде псевдонима. Благодарю.
Питер
@glennjackman: спасибо. Какие-нибудь подробности о разнице между 'ls'и command ls?
Чороба
Чороба, я думаю, что эта страница отвечает на ваш последний вопрос - ss64.com/bash/command.html . «Выполняются только встроенные в оболочку команды или команды, найденные при поиске в PATH. Если есть функция оболочки с именем ls, выполнение команды` ls 'внутри функции будет выполнять внешнюю команду ls вместо рекурсивного вызова функции. "
Питер
@Peter: Это то, что цитирует 'ls'тоже.
Чороба
1

Используйте -z, чтобы проверить, не установлена ​​ли переменная.

alias ls='[ -z $1 ] && ls * || ls $*'

источник
Извините, я просто переписал свой вопрос, так как вы ответили на первую версию. Имеет ли это смысл с моим новым вопросом? Спасибо за помощь.
Питер
Мой ответ был всего лишь примером, показывающим проверку переменной, и ее должно быть легко адаптировать к вашим потребностям, в основном все, что вам нужно сделать - [ -z $1 ] && IfThereIsNoVariable || IfThereIsAVariableэто после того, как && выполнит команду, когда вы только что запустились, lsdи после || пойдет команда, если вы lsd *.sh
Благодарю. Итак, для ясности, -za является частью команды ls или определена для псевдонима, или это часть bash?
Питер
Это часть bash, [ -z $1 ]является оператором сценария оболочки. но теперь, когда я думаю об этом, вам нужно будет превратить его в другой сценарий, а затем в псевдоним этого сценария. ех. alias lsd='Path/To/Script'затем поместите [ -z $1 ] && LsWithoutArguement || LsWithArguementвнутрь Path / To / Script
0

Как уже говорили другие, «псевдоним» не обрабатывает аргументы командной строки, указанные в командной строке, которая вызывает команду «псевдоним». Он просто передает все аргументы командной строки замещенной команде, добавляя аргументы в конец.

Вот пример тестового скрипта, чтобы показать этот эффект ...

Начните с такого сценария:

[~]# cat /some...path/ls1.sh
#!/bin/sh

dollarpound="$1"
shift
dollarone="$1"
shift

echo ""
echo "dollarpound=\"$dollarpound\""
echo "dollarone=\"$dollarone\""
echo "\$*=\"$*\""
echo "\$@=\"$@\""
echo "\$1=\"$1\""
echo "\$2=\"$2\""
echo ""

if [ $# -eq 0 ]; then
  echo ls --color -lh *
else
  echo "ls --color -lh $*"
fi
echo ""
[~]#

Затем назначьте этот сценарий псевдониму:

[~]#alias lsx='/some...path/ls1.sh $# "$1"'
[~]#

Вызвать псевдоним lsxбез аргументов:

[~]# lsx

dollarpound="0"
dollarone=""
$*=""
$@=""
$1=""
$2=""

ls --color -lh ant bat cat dog eel.txt fox.txt goat.jpg horse.jpg

[~]#

Вызвать псевдоним lsxс 1 аргументом "*.txt":

[~]# lsx *.txt

dollarpound="0"
dollarone=""
$*="eel.txt fox.txt"
$@="eel.txt fox.txt"
$1="eel.txt"
$2="fox.txt"

ls --color -lh eel.txt fox.txt

[~]#

Обратите внимание, что скрипт, вызванный командой «aliased», сообщает 0аргументы вместо 1( "*.txt") или 2( "eel.txt", "fox.txt").

Вызвать псевдоним lsxс 4 аргументами:

[~]# lsx ant bat cat dog

dollarpound="0"
dollarone=""
$*="ant bat cat dog"
$@="ant bat cat dog"
$1="ant"
$2="bat"

ls --color -lh ant bat cat dog

[~]#

Обратите внимание, что скрипт, вызываемый командой «aliased», сообщает 0аргументы вместо 4.



Итак, рабочая версия скрипта:

[~]# cat /some...path/ls2.sh
#!/bin/sh

if [ $# -eq 0 ]; then
  \ls --color -lh *
else
  \ls --color -lh $*
fi
[~]#

(Обратите внимание на \before ls. Это предотвращает lsдальнейшую замену другими «псевдонимами» и т. Д.).

Назначьте рабочий сценарий псевдониму:

# alias lsx='/some...path/ls2.sh'
[~]#

Вызвать псевдоним lsxбез аргументов:

[~]# lsx
-rw-r--r-- 1 someuser someuser    0 Jan 21 02:42 eel.txt
-rw-r--r-- 1 someuser someuser    0 Jan 21 02:42 fox.txt
-rw-r--r-- 1 someuser someuser    0 Jan 21 02:42 goat.jpg
-rw-r--r-- 1 someuser someuser    0 Jan 21 02:42 horse.jpg

ant:
total 0

bat:
total 0

cat:
total 0

dog:
total 0
[~]

Обратите внимание, что сценарий обнаружил отсутствие аргументов и запустился "ls *"вместо "ls"(без аргументов).

Вызвать псевдоним lsxс 1 аргументом "*.txt":

[~]# lsx *.txt
-rw-r--r-- 1 someuser someuser 0 Jan 21 02:42 eel.txt
-rw-r--r-- 1 someuser someuser 0 Jan 21 02:42 fox.txt
[~]

Вызвать псевдоним lsxс 4 аргументами:

[~]# lsx ant bat cat dog
ant:
total 0

bat:
total 0

cat:
total 0

dog:
total 0
[~]#

Если есть причина, по которой вы хотите сделать это с «псевдонимом», это должно работать для вас. Просто дайте псевдониму и сценарию любые имена, которые вам нравятся. Например, если вы хотите «псевдоним» lsкоманды, используйте alias ls='/some...path/ls2.sh'(с путем и именем, которые вы использовали для сценария).

С другой стороны, если вы хотите, чтобы эта команда имела уникальное имя, как, lsxнапример, было бы проще просто дать сценарию это имя и поместить сценарий в папку, которая включена в путь, например:, /bin/lsxили как угодно тебе нравится.

Кевин Феган
источник