Я пытаюсь создать псевдоним bash, чтобы сделать следующее:
Имя файла передается псевдониму как переменная. Например, my-alias file.txt
Вот несколько способов, которыми я пытался это сделать (хотя я пробовал еще несколько вариантов):
alias my-alias="mkdir -v -p '$(date +%F)-List' && cp $1 './$(date +%F)-List/$1' && cd '$(date +%F)-List'"
alias my-alias="mkdir -v -p '$(date +%F)-List' && cp $1 ./$(date +%F)-List/$1 && cd '$(date +%F)-List'"
alias my-alias="mkdir -v -p '$(date +%F)-List' && cd '$(date +%F)-List' && cp ../$1 ./$1"
Я пробовал много способы написания команды, и ни один не работает.
Что я упускаю?
Это в Mac OS, которая должна быть такой же, как и в большинстве других сред Linux.
ОБНОВЛЕНИЕ: ГДЕ Я ОШИБАЛСЯ
Я понял, где я запутался. У меня есть много настроенных псевдонимов, которые «появляются» для получения аргументов. Я установил их давным-давно (несколько лет назад).Теперь я понимаю, что псевдонимы, кажется, получают только аргументы, потому что псевдоним может обрабатывать все, что следует за ним при вводе в командной строке. Но он будет обрабатывать эти «аргументы», только если они находятся в конце командной строки, на которую ссылается псевдоним, и в том же порядке. Итак, как только я начал пытаться перетасовать аргументы в командной строке псевдонимов, псевдоним сломался. Так что да, лучший подход - использовать функцию.
Использовать функцию вместо псевдонима. Это почти всегда ответ, если у вас возникнут проблемы с работой псевдонима. Особенно, если вы пытаетесь использовать аргументы (, например. $1
), поскольку псевдонимы на самом деле не принимают аргументов.
Кроме того, вы всегда должны заключать в двойные -кавычки ссылки на параметры и переменные (, то есть "$1"
вместо$1
). И не запускайте date
несколько раз, так как возможно (если маловероятно )вы получите разные результаты; запустите его один раз и сохраните результат в переменной. Попробуйте это:
my-function() {
local subdir="$(date +%F)-List"
mkdir -v -p "$subdir" &&
cp "$1" "$subdir/$1" &&
cd "$subdir"
}
Вам нужно создать функцию. mkdir -v -p '$(date +%F)-List'
будет оцениваться только во время создания псевдонима
Если вы должны использовать псевдоним, вот тот, который работает с использованием -t для указания каталога назначения перед фактическим аргументом для перемещаемого файла:
alias my-alias="mkdir \$(date +%F); mv -t \$(date +%F)"
Работает в Linux, но у меня нет компьютера с MacOS для тестирования.
Как показывают ответы на другие вопросы, :Псевдонимы просто не подходят для обработки параметров. Вы даже можете видеть, что:
param=foo; do something with "$param"
Так работают параметры :Сначала (и во времени, и в командной строке )их задаешь, потом используешь. В отличие от этого:
<alias string with several commands to be expanded> <parameter>
Параметр может быть параметром последней команды в псевдониме. Это не то, что вам нужно.
Вы можете сделать это с помощью псевдонима, создав его как единую команду с точки зрения оболочки, но сомнительно, что это полезный подход:
alias testalias='bash -c "echo \$1; echo \$1-" bash'
$ testalias foo
foo
foo-
Одним из аргументов против этого является сложность цитирования. Даже я ошибся первым.