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

9

Я хочу легко установить псевдоним git-goдля этой строки терминала:

git commit -m "init "; git push; git status

Поэтому, когда я вхожу в git-go, эта строка должна войти.

Как я могу это сделать? Ответы, которые я видел, покрывают только псевдоним команды без параметров. Но я хочу установить псевдоним произвольной терминальной линии.

Филипп Рего
источник
Что ты пробовал? Какие еще вопросы вы читали? askubuntu.com/q/17536/507051 объясняет это довольно хорошо, что именно ваш вопрос?
десерт
Моя проблема заключалась в использовании двойных кавычек вместо одинарных для внешних кавычек.
Филипп Рего
Вы также можете сделать это наоборот, используя двойные кавычки снаружи и одинарные кавычки внутри.
Видеонавт
3
Возможный дубликат Как мне создать постоянный псевдоним Bash?
Фабби

Ответы:

13

Вы делаете это так же, как и любой псевдоним.

alias git-go='git commit -m "init "; git push; git status'

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

Например, все, что вы пишете после имени этого псевдонима, будет вставлено в конец и, таким образом, передано в качестве аргументов командной строки третьей gitкоманде после git status. (Действительно, следующий текст вставляется не в конец, а в том, что следующий текст остается один, а псевдоним заменяется его определением.)

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

git-go

Или вы можете запустить его с аргументами, которые вы хотите передать git status . Например, когда вы запускаете его таким образом, последняя команда git-status --show-stash:

git-go --show-stash

То, что вы не можете сделать с псевдонимом в Bash (и других оболочках в стиле Bourne), это заставить псевдоним принимать аргументы командной строки и размещать их в другом месте, чем конец.

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

git-go() { git commit -m "$1"; git push; git status; }

В определении функции оболочки, позиционные параметры $1 , $2и так далее удерживать значение аргументов командной строки , переданных функцию оболочки. У псевдонимов нет никакой функциональности, которая соответствует этому, потому что расширение псевдонима действительно является формой макрообработки, которая происходит очень рано, когда оболочка анализирует команду.

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

Элия ​​Каган
источник
1
Еще лучше: разместите скрипт с именем git-goв вашем PATH и он git goбудет работать.
Д. Бен Кнобл
10

Вы можете объявить это функцией в вашем ~/.bash_aliasesфайле следующим образом:

git-go(){
    git commit -m "init "
    git push
    git status
}

или вы можете создать псевдоним в том же файле, например:

alias git-go='git commit -m "init "; git push; git status'

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

Videonauth
источник
1
Одним из преимуществ написания функции оболочки вместо псевдонима является то, что не нужно вкладывать кавычки. Таким образом, этот ответ направлен на решение центральной проблемы, которая, как оказалось, была у ОП более прямой, чем у меня.
Элия ​​Каган
@EliahKagan Оба хороши для этого вопроса, хотя ваш больше. Приятно видеть тебя обратно.
Видеонавт
4

Поскольку вы имеете дело с gitкомандами, вы также можете узнать синтаксис для добавления псевдонима специально для git:

git config --global alias.go '!sh -c "git commit -m \"init\"; git push; git status"'

Это добавит новый псевдоним в вашу локальную gitконфигурацию (at ~/.gitconfig) и позволит вам выполнить

git go

когда внутри gitхранилища. Всякий раз, когда вы бежитеgit go оболочку, вызывается и команда git commit -m "init"; git push; git statusпередается ей.

Смотрите документацию git для получения более подробной информации.

PerlDuck
источник
3

Это была проблема с цитированием. Я пробовал это:

alias="git commit -m "init "; git push; git status"

Но получил эту ошибку:

bash: ; git push; git status: command not found

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

alias='git commit -m "init "; git push; git status'

Или:

alias="git commit -m 'init '; git push; git status"

Или без кавычек, если в сообщении о фиксации нет пробелов:

alias="git commit -m init; git push; git status"
Филипп Рего
источник
Спасибо за публикацию этого ответа (так как мой ответ и видеоавтобус не слишком сосредоточены на проблеме цитирования). Из любопытства, почему вы хотели использовать пробел в сообщениях коммитов?
Элия ​​Каган
Раньше я вставлял эту строку вручную и добавлял сообщение после пробела, но здесь это не имеет смысла, поэтому я его убрал.
Филипп Рего
1
В этом случае вам не нужно цитировать init; оболочка лечит 'init', "init"и initто же самое. (Таким образом, вы можете захотеть вернуть исходную версию, а также показать новую версию, чтобы проиллюстрировать ситуацию, когда требуются вложенные кавычки.) Что касается возможности добавления остальной части сообщения, вы можете передать это как командную строку. аргумент, если (как показано в видео-ответах и ​​моих ответах) вы определили функцию вместо псевдонима. Например, вы могли бы определить git-go() { git commit -m "init $1"; git push; git status; }(это то, что я имею в своем ответе, но "init $1"вместо просто "$1").
Элия ​​Каган
Спасибо, вот что я хотел попробовать дальше.
Филипп Рего