Передать подстановочный знак в псевдоним

#shell #unix #ksh

#оболочка #unix #ksh

Вопрос:

Я использую команду modifies list в качестве псевдонима (в KSH):

alias ltf='ls -lrt -d -1 $PWD/*'

Итак, команда ltf отображает что-то вроде этого:

-rw-r--r-- 1 myuser mygroup 0 Apr 18 12:00 /usr/test.txt
-rw-r--r-- 1 myuser mygroup 0 Apr 18 12:00 /usr/test.log

Теперь я хочу использовать подстановочные знаки. Но использование ltf *.log не работает.

Каков наилучший способ добиться этого?


Обновление: Я хочу уточнить свой вопрос, потому что ответы пока не решают мою проблему: команда ls -lrt -d -1 $PWD/* выполняет команду list с некоторыми параметрами И отображает полный путь, что для меня важно.

К сожалению, подход с псевдонимами не допускает подстановочных параметров. Моя цель — сделать это возможным. Вероятно, это лучший способ создать команду как функцию. Это упоминается в ответах, но пока не работает (см. Комментарии).

Есть идеи?

Ответ №1:

Используйте функцию оболочки вместо псевдонима:

 function ltf {
  if [ -z "$1" ]; then
    ls -lrtd1 ${PWD}/*
  else
    ls -lrtd1 $1
  fi
}
  

Комментарии:

1. Из интереса, есть ли в ksh аналогичное обозначение, подобное этому для bash: [[ -z "$1" ]] amp;amp; ls -lrtd1 "$PWD/*" || ls -lrtd1 "$1"

2. Я думаю, что это должно быть ls -lrtd1 ${PWD}/$1 после инструкции else . Спасибо!

3. @TechnoCore: нет. [ -z "$1" ] имеет значение true, если "$1" является пустой строкой, т.Е. аргумент отсутствует.

4. команда PWD также должна выполняться, если есть аргумент; ls -lrtd1 $1 не показывает полный путь

5. После некоторого тестирования я думаю, что этот подход не решает проблему. Если подстановочный знак (например, *.log) возвращает более одного файла, то в списке указан только один файл ltf *.log .

Ответ №2:

Ваша проблема в том, что подстановочные знаки расширяются оболочкой в вашем текущем каталоге, а не в $ PWD. Вы можете решить эту проблему, используя функцию оболочки, а не псевдоним, и заключив ее в кавычки (я использую $ HOME в примере для моего удобства) — поместите это в .bashrc:

 ltf() {
    ls $HOME/$*
}
  

и затем:

 $ ltf '*.log'
  

Ответ №3:

попробуйте

 alias ltf='ls -lrt -d -1 $1'
  

или, если вам нужно много параметров

 alias ltf='ls -lrt -d -1 $@'
  

Комментарии:

1. Это не работает, $1 etc не распознаются псевдонимами. Причина, по которой вы все равно можете получить результаты, заключается в том, что $1 это будет пустая строка, поэтому ltf path так и будет ls -lrt -d -1 path . Таким образом, вы должны использовать alias ltf='ls -lrt -d -1' для того же эффекта, и если это не сработает, вам нужно будет использовать функцию.

Ответ №4:

Как упоминалось другими, расширение подстановочного знака выполняется перед вызовом функций оболочки, но не так с псевдонимом.

Если вам не нужно изменять входные данные (что делает OP), это будет работать нормально:

 alias ltf='ls -lrt -d -1'
  

Чтобы достичь того, чего хочет OP, в функции оболочки вам нужно было бы использовать $@ оператор для доступа к набору файлов, полученных в результате расширения подстановочного знака, который затем вам нужно было бы добавить:

 ltf() 
{ 
    #Prepend $PWD to the start of every input
    set -- "${@/#/$PWD/}"   

    #Run the command on the prepended input
    ls -lrt -d -1 $@;
}