Подтвердить что ты не робот

Как определить псевдоним bash как последовательность нескольких команд?

Я знаю, как настраивать псевдонимы в bash, но есть ли способ настроить псевдоним для последовательности команд?

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

Кроме того, есть ли способ настроить команду, которая запускает "sudo mycommand", а затем вводит пароль? В дни MS-DOS я искал бы .bat файл, но я не уверен в эквиваленте Linux (или в этом случае Mac OSX).

4b9b3361

Ответ 1

Вы упоминаете файлы BAT, поэтому, возможно, вы хотите написать оболочку script. Если это так, просто введите команды, которые вы хотите по очереди, в файл следующим образом:

command1
command2

и попросите bash выполнить файл:

bash myscript.sh

Если вы хотите напрямую вызвать script, не набрав "bash", добавьте следующую строку в первую строку файла:

#! /bin/bash
command1
command2

Затем отметьте файл как исполняемый файл:

chmod 755 myscript.sh

Теперь вы можете запускать его так же, как и любой другой исполняемый файл:

./myscript.sh

Обратите внимание, что unix действительно не заботится о расширениях файлов. Вы можете просто назвать файл "myscript" без расширения ".sh", если хотите. Это важная специальная первая строка. Например, если вы хотите написать свой script на языке программирования Perl вместо bash, первая строка будет следующей:

#! /usr/bin/perl

Эта первая строка сообщает вашей оболочке, какой интерпретатор вызывается для выполнения script.

Кроме того, если теперь вы скопируете свой script в один из каталогов, перечисленных в переменной среды $PATH, вы можете вызвать его из любого места, просто набрав его имя файла:

myscript.sh

Выполняется даже выполнение табуляции. Вот почему я обычно включаю каталог ~/bin в мой $PATH, чтобы я мог легко установить личные скрипты. И самое главное, когда у вас есть куча личных сценариев, с которыми вы привыкли, вы можете легко перенести их на любую новую машину unix, скопировав свой личный каталог ~/bin.

Ответ 2

Чтобы связать последовательность команд, попробуйте следующее:

alias x='command1;command2;command3;'

Или вы можете сделать это:

alias x='command1 && command2 && command3'

& & делает это только выполнение последующих команд, если предыдущие успешно завершены.

Также для ввода паролей в интерактивном режиме или для взаимодействия с другими программами, такими как, проверьте выход. (http://expect.nist.gov/)

Ответ 3

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

В вашем .bashrc

perform_my_command() {
    pushd /some_dir
    my_command "[email protected]"
    popd
}

Затем в командной строке вы можете просто:

perform_my_command my_parameter my_other_parameter "my quoted parameter"

Вы можете делать все, что вам нравится в функции, вызывать другие функции и т.д.

Вы можете ознакомиться с Advanced Bash Scripting Guide для углубленного изучения.

Ответ 4

Для псевдонима вы можете использовать это:

alias sequence='command1 -args; command2 -args;'

или если вторая команда должна быть выполнена только в том случае, если первая успешно используется:

alias sequence='command1 -args && command2 -args'

Ответ 5

Лучше всего, скорее всего, использовать функцию оболочки вместо псевдонима, если логика становится более сложной или вам нужно добавить параметры (хотя bash поддерживает параметры псевдонимов).

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

function myfunc {
   ( cd /tmp; command )
}

затем из командной строки

$ myfunc

Для вашего второго вопроса вы можете просто добавить свою команду в /etc/sudoers (если вы полностью уверены в том, что вы делаете)

myuser           ALL = NOPASSWD: \
                    /bin/mycommand 

Ответ 6

По нескольким командам в одном псевдониме вы можете использовать один из логических операторов для их объединения. Здесь один, чтобы переключиться на каталог и сделать ls на нем

      alias x="cd /tmp && ls -al"

Другой вариант - использовать функцию оболочки. Это команды sh/zsh/ bash. Я не знаю достаточно других оболочек, чтобы убедиться, что они работают.

Что касается вещи sudo, если вы этого хотите (хотя я не думаю, что это хорошая идея), правильный способ - изменить файл /etc/sudoers, чтобы получить то, что вы хотите.

Ответ 7

Вы можете вставить объявление функции, за которым следует функция в самом псевдониме, например:

alias my_alias='f() { do_stuff_with "[email protected]" (arguments)" ...; }; f'

Преимущество такого подхода в простом объявлении функции само по себе состоит в том, что вы можете иметь спокойствие, что ваша функция не будет переопределена каким-либо другим script источником поиска (или использованием .), который может использовать свой собственный помощник под тем же именем.

Например, предположим, что вы вызываете script init-my-workspace.sh, который вы вызываете как . init-my-workspace.sh или source init-my-workspace.sh, целью которого является установка или экспорт связки переменных среды (например, JAVA_HOME, PYTHON_PATH и т.д.). Если у вас также есть функция my_alias внутри, то вам не повезло, так как последнее объявление функции с тем же экземпляром оболочки выигрывает.

И наоборот, псевдонимы имеют отдельное пространство имен и даже в случае столкновения имен, они сначала просматриваются. Поэтому для настройки, связанной с интерактивным использованием, вы должны использовать только псевдонимы.

Наконец, обратите внимание, что практика размещения всех псевдонимов в одном и том же месте (например, ~/.bash_aliases) позволяет легко выявить любые столкновения имен.

Ответ 8

вы также можете написать функцию оболочки; пример для "cd" и "ls" combo здесь