#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 $@;
}