1

Я хочу иметь скрипт для вызова с params, который добавляет псевдонимы в мою текущую оболочку. Псевдонимы должны быть построены относительно параметров вызова и текущего каталога, откуда я его запускаю. Если возможно, я не хотел бы использовать сценарий, просто запустите его, как любой другой сценарий.

Это то, что я сделал до сих пор:

Я написал небольшой скрипт для генерации псевдонимов, например

echo 'alias foo="$1"'

и сохраните его как файл "myscript" с +x правами. Затем я выполняю его через консоль, чтобы установить псевдоним

$(myscipt hello)

это отлично работает

Когда я меняю свой сценарий оболочки, как

echo 'alias foo="bar $1 -param"'

и выполнить снова, как указано выше, результат

bash: alias hello" not found
bash: alias -param" not found

???. Я уже избежал пробелов между баром и -парам, но не могу заставить его работать.

когда я выполню

source <(myscript hello)

все хорошо, как и ожидалось (это мое решение на данный момент, но не уверен, что оно лучшее).

Некоторые идеи, как получить лучшее решение?

2 ответа2

5

Вы используете source команду неправильно. Я предполагаю, что у вас есть файл с именем myscript который содержит эти команды. Вместо того, чтобы создавать нужные команды в файле, вот так

echo 'alias foo="bar -param"'

Вы должны просто иметь команды, как это

alias foo="bar -param"

Затем вы передаете свой сценарий непосредственно source команде, которая запускает его в текущей оболочке, чтобы изменения, внесенные в сценарий, отражались в текущей сессии оболочки:

source myscript

Кроме того . Команда эквивалентна:

. myscript

(Обратите внимание, что между . И myscript .)


Обновить

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

$ foo=hello
$ alias $foo='echo hi'
$ hello
hi

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

0

set -x оказывается информативным:

: $; set -x
: $; $(./alias-builder)
++ ./alias-builder
+ alias 'foo="bar' '$1' '-param"'
bash: alias: $1: not found
bash: alias: -param": not found
: $; 

Итак, здесь происходит то, что когда bash рассматривает вывод alias-builder (это имя, которое я дал сценарию, содержащему вашу команду echo) как нечто, заменяющее inline как аргументы, он разделяет вывод на слова, как обычно это происходит, но трактует кавычки как часть слов, а не как то, что вы ожидаете, то есть для анализа вывода так, как если бы он был напечатан.

Я думаю, что в конечном итоге ваш ответ заключается в использовании опции source .

Теперь, если это неудобно набирать, вы можете сделать что-то вроде этого:

metamyscript() {
    source <(myscript "$@")
}

И тогда вы должны быть в состоянии сделать, просто:

: $; metamyscript hello

и он запустит myscript hello , и получит вывод этого.

(Конечно, вы можете поменять имена по своему вкусу.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .