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

3 ответа3

4

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

ls () {
    if [[ -z $1 ]] ; then
        command ls *
    else
        command ls "$@"
    fi
}
1

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

alias ls='[ -z $1 ] && ls * || ls $*'
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, или как хочешь.

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