псевдоним bash для создания папки и перемещения файла

Я пытаюсь создать псевдоним bash, чтобы сделать следующее:

  1. создать папку (с текущей датой как имя папки)
  2. переместить (или скопировать, как мне удобно) файл из текущей папки в новую папку.

Имя файла передается псевдониму как переменная. Например, 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
30.06.2020, 02:24
4 ответа

Использовать функцию вместо псевдонима. Это почти всегда ответ, если у вас возникнут проблемы с работой псевдонима. Особенно, если вы пытаетесь использовать аргументы (, например. $1), поскольку псевдонимы на самом деле не принимают аргументов.

Кроме того, вы всегда должны заключать в двойные -кавычки ссылки на параметры и переменные (, то есть "$1"вместо$1). И не запускайте dateнесколько раз, так как возможно (если маловероятно )вы получите разные результаты; запустите его один раз и сохраните результат в переменной. Попробуйте это:

my-function() {
    local subdir="$(date +%F)-List"
    mkdir -v -p "$subdir" &&
        cp "$1" "$subdir/$1" &&
        cd "$subdir"
}
3
18.03.2021, 23:23

Вам нужно создать функцию. mkdir -v -p '$(date +%F)-List'будет оцениваться только во время создания псевдонима

-1
18.03.2021, 23:23

Если вы должны использовать псевдоним, вот тот, который работает с использованием -t для указания каталога назначения перед фактическим аргументом для перемещаемого файла:

alias my-alias="mkdir \$(date +%F); mv -t \$(date +%F)"

Работает в Linux, но у меня нет компьютера с MacOS для тестирования.

4
18.03.2021, 23:23

Как показывают ответы на другие вопросы, :Псевдонимы просто не подходят для обработки параметров. Вы даже можете видеть, что:

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-

Одним из аргументов против этого является сложность цитирования. Даже я ошибся первым.

1
18.03.2021, 23:23

Теги

Похожие вопросы