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

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

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

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


person stormist    schedule 25.01.2010    source источник


Ответы (8)


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

command1
command2

и попросите bash запустить файл:

bash myscript.sh

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

#! /bin/bash
command1
command2

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

chmod 755 myscript.sh

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

./myscript.sh

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

#! /usr/bin/perl

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

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

myscript.sh

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

person slebetman    schedule 25.01.2010
comment
Вы также можете использовать функцию оболочки myfunc() { command1 && command2}, если не хотите захламлять место файлами. - person Noufal Ibrahim; 26.01.2010
comment
Но захламлять место файлами менее беспорядочно, чем захламлять файл .bashrc функциями. Думайте модульно :-) - person slebetman; 26.01.2010
comment
На каком языке написаны сценарии оболочки? - person stormist; 26.01.2010
comment
Вы не поверите, но оболочка, в которой вы печатаете, - это не просто командная строка, а полноценный, полный по Тьюрингу язык программирования (хотя и с ужасным синтаксисом). Итак, сценарии оболочки написаны на языке оболочки. И в unixland доступно несколько оболочек: sh (классическая оболочка Bourne), bash (оболочка Bourne-Again, произошедшая от sh), csh (классическая оболочка c), tcsh (эволюция от csh), ksh (оболочка korn). есть несколько других, но они наиболее распространены. В наши дни в Linux большинство сценариев оболочки пишут с помощью bash. - person slebetman; 26.01.2010
comment
Обратите внимание, что нет необходимости писать сценарии оболочки на языке оболочки, которую вы используете в своем терминале, поскольку строка shbang позволяет вам указать, под какой оболочкой запускается сценарий. Необходимо только установить на машине оболочку, которую вы используете для написания скриптов. - person slebetman; 26.01.2010
comment
Другие языки сценариев, такие как Tcl, Perl, Python, Ruby и Lua, просто используют механизм shbang для реализации исполняемых сценариев. Разница между надлежащими языками сценариев и оболочками заключается в том, что обычно нецелесообразно использовать язык сценариев в качестве интерпретатора команд - у них слишком много синтаксиса! - person slebetman; 26.01.2010
comment
Примечание. Из других ответов вы должны были заметить, что вы можете писать функции в своей оболочке - намек на то, что оболочка на самом деле является языком программирования. - person slebetman; 26.01.2010

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

alias x='command1;command2;command3;'

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

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

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

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

person Larry Shatzer    schedule 25.01.2010
comment
Прошло некоторое время с тех пор, как я сделал это, но я думаю, что первое предложение приведет к тому, что 3 команды будут выполняться параллельно (или в максимально возможной степени), а второе будет иметь 3 команды, выполняемые последовательно. В любом случае, я не уверен, что они делают то же самое. - person FrustratedWithFormsDesigner; 26.01.2010
comment
Я просто попробовал это с псевдонимом x = 'date; sleep 1; date' И результат такой, как я ожидал (две даты с интервалом в 1 секунду), с задержкой сна между каждым выходом даты. - person Larry Shatzer; 26.01.2010
comment
@ Разочарованный: Нет. Оба выполняются последовательно. Только первому все равно, если предыдущая команда не сработает. Для параллельного выполнения будет: command1 & command2 & command3 - person slebetman; 26.01.2010
comment
Есть идеи, как заставить это работать с подстановочным знаком? Скажем, я хочу удалить свою локальную ветку stage на git всякий раз, когда я перехожу из нее в свою ветку функций. - person riders994; 18.04.2019
comment
А как насчет x аргументов? - person Sosukodo; 26.04.2019
comment
Если вам нужны аргументы для псевдонима, вам нужно написать функцию. См. stackoverflow.com / questions / 7131670 / - person Larry Shatzer; 26.04.2019

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

В вашем .bashrc

perform_my_command() {
    pushd /some_dir
    my_command "$@"
    popd
}

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

perform_my_command my_parameter my_other_parameter "my quoted parameter"

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

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

person wich    schedule 25.01.2010

В качестве псевдонима вы можете использовать это:

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

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

alias sequence='command1 -args && command2 -args'
person gregseth    schedule 25.01.2010

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

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

function myfunc {
   ( cd /tmp; command )
}

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

$ myfunc

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

myuser           ALL = NOPASSWD: \
                    /bin/mycommand 
person Diego Torres Milano    schedule 25.01.2010

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

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

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

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

person Noufal Ibrahim    schedule 25.01.2010

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

alias my_alias='f() { do_stuff_with "$@" (arguments)" ...; }; f'

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

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

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

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

person eold    schedule 03.10.2015

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

person B.Kocis    schedule 08.07.2014