Развернуть псевдоним, который выполняет другой псевдоним (Nested Alias) - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть два псевдонима:

alias ls="ls -G"
alias la="ls -aFhlT"

Я знаю, что после того, как вы введете псевдоним, но перед тем, как выполнить, вы можете набрать Мета - Контроль - e (возможно Alt - Контроль - e , но, возможно, Esc - Контроль - e ), чтобы расширить то, что вы ' мы набрали.

Итак, если я расширю свой псевдоним la, используя этот метод, я получу:

ls -aFhlT

Тем не менее, я действительно хочу увидеть:

ls -G -aFhlT

Есть ли способ добиться этого, кроме ввода Meta - Control - e во второй раз?

- ИЛИ -

Есть ли способ подтвердить, что мое выполнение la действительно выполнило ls -G -aFhlT (кроме как знать, как работают вложенные псевдонимы, и полагать, что оно выполнило то, что, как я думаю, было)?

Я пытаюсь сделать это на macOS, но также будет принято общее решение для bash.

1 Ответ

0 голосов
/ 02 мая 2018

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

Я написал для этого функцию bash:

xtrace() {
    local eval_cmd
    printf -v eval_cmd '%q' "${@}"
    { set -x
      eval "${eval_cmd}"
    } 2>&1 | grep '^++'
    return "${PIPESTATUS[0]}"
}

Флаг -v printf сохранит вывод printf в указанной переменной.

В строке формата printf %q будет напечатан соответствующий аргумент (* в этом случае $@) в кавычках , многократно используемый в качестве ввода. Это устраняет опасности, связанные с передачей произвольного кода / команд eval.

Затем я использую группу команд { ... }, чтобы я мог контролировать функциональность set -x, которая сообщает bash для печати трассировки всех выполненных команд. Для моих целей мне не нужны никакие выходные данные, кроме полностью развернутой команды, поэтому я перенаправляю stderr и grep для строки вывода, которая начинается с "++". Это будет строка, которая показывает полностью развернутую команду.

Наконец, я возвращаю значение PIPESTATUS[0], которое содержит код возврата команды last , выполненной в группе команд (то есть команда eval).

Таким образом, мы получим что-то вроде следующего:

$ xtrace la; echo $?
++ ls -G -aFhlT
0

Большое спасибо @CharlesDuffy за рекомендацию set -x, а также входной санитарии для eval.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...