Можно ли определить команду в bash?

25

Например, я могу установить:

gb = cd /media/Dan/evolution

... так что каждый раз, когда я выполняю gbв bash, я могу cdв этот конкретный каталог?

Я нашел что-то онлайн: aliasкоманда. Но кажется, что он не может сделать работу выше.

Возможно ли это сделать? Как?

Zen
источник
10
alias gb='cd /media/Dan/evolution'
Ныкакин
4
@ Zen, пожалуйста, примите ответ, если это решит проблему. Это жест сказать спасибо пользователю, который помог вам в решении проблемы :)
Рамеш
2
Примечание: речь идет о bash: Linux - это ядро. Linux часто неправильно используется для обозначения всей операционной системы. Это может привести к путанице. Например, вопрос «могу ли я делать то же самое в Linux?»: Если вы можете сделать это на каком-то компьютере, тогда да. Потому что вы можете реализовать любую понравившуюся вам операционную систему, используя ядро ​​Linux. Поэтому нам нужно знать, какой из них вы используете Ubuntu Gnu + Linux +, вероятно, X11 (если на рабочем столе, то есть не на сервере без дисплея).
ctrl-alt-delor
@ Richard Хороший вопрос, хотя технически это posixжалоба, так что не просто bash.
1
@ Richard В самом деле, это проблема. Это работает, потому что люди не имеют в виду Android и такие разновидности, более или менее. Я не говорю, что это хорошо, но это то, что есть. Мой реферал был неявным, так как я комментировал ваше заявление о Linux. Я просто прояснял себя, поскольку предметом был запутанный термин. (Возможно, я неправильно понял ваш последний комментарий)
keyser

Ответы:

50

просто введите:

alias gb='cd /media/Dan/evolution'

Чтобы сделать этот параметр постоянным (чтобы он оставался после перезагрузки или открытия другой консоли), добавьте эту строку в файл ~ / .bashrc (при условии, что вы используете bash в качестве оболочки по умолчанию)

schrobe
источник
Чтобы сделать его еще более приятным, вы можете создать выделенный файл псевдонимов для своих псевдонимов, скажем, ~ / .bash_aliases, и вызвать его из своего файла ~ / .bashrc, например: [-e ~ / .bash_aliases] &&. ~ / .bash_aliases Таким образом, вы не «загрязняете» файл ~ / .bashrc другими вещами.
GeertVc
39

Альтернатива псевдонимам

gb() { cd /media/Dan/evolution; }

Это определяет функцию оболочки gb, которая не принимает аргументов и выполняет cd / media / Dan / evolution. Как и в случае других предложений, это можно добавить в ~ / .bashrc

user1207217
источник
С недостатком в том, что команда alias показывает определенный псевдоним, afaik, определяющий такую ​​функцию, может привести к «неожиданному поведению». Я буду голосовать за тебя ради полноты :)
vfbsilva
7
На самом деле, нет. Вы можете просто набрать: объявлять -f gb, чтобы увидеть, что он делает
Пол Калабро
11
Кроме того, эта опция более гибкая в том смысле, что она позволяет вам добавить свою пользовательскую логику в определение функции, чтобы принимать аргументы и делать все, что вам нужно. Псевдонимы позволяют только передавать аргументы и выполнять предопределенные действия .
Пол Калабро
5
@PaulCalabro Еще лучше, type gbбудет работать, если это псевдоним или функция.
Sparhawk
POSIXLY: { echo 'true() { : ; }' >./script ; . ./script ; command -V true ; command -V /usr/bin/true ; }- true is a shell function\n/usr/bin/true is /usr/bin/true- то \nперсонажи были буквальные переводы строк в выводе.
mikeserv
11

Это возможно, и aliasэто команда, которую вы ищете. Например, alias ll="ls -l"в Bash позволит вам печатать llвместо ls -l. Обратите внимание, что при установке псевдонима пробелы не используются. man aliasможет быть полезным.

schaiba
источник
-3

Кроме того, можно написать программу на C, которая вызывает нужную команду, и сохранить ее в / usr / bin.

#include <stdio.h>
#include <string.h>

int main () {
    char command[50]; //notice you can change this to fit your needs
    int return_val;

    strcpy( command, "echo \"cd /media/Dan/evolution\" | bash -i" );
    return_val = system(command); 

   //this is equivalent to entering the command in a new bash, 
   //which will return and exit

    return return_val;
}

Чтобы скомпилировать его, перейдите в каталог, в котором был сохранен исходный код (в bash), и выполните (вам может понадобиться sudo):

 gcc ./gb.c -o /usr/bin/gb

После дальнейших исследований здесь , я понял , просто бросать команду system()не будет работать на баш , построенном в командах. Вот почему вам нужно создать экземпляр интерактивного bash и отобразить в нем ваши команды. Это просто слишком сложно и, вероятно, бесполезно, если, например, вы не хотите сократить вызов сценария оболочки ( some_scriptвместо sh ~/radgeRayden/Scripts/some_script).

Ссылка на функцию system ()

radgeRayden
источник
2
Вы действительно пробовали это? Не работает
Деннис
1
По той же причине, что sh -c "cd /media/Dan/evolution"не работает. Подсказка: subshell
Цифровая травма
5
cd/ subshell, не говоря уже о том, что является преимуществом в обертывании команды оболочки в c-программе, когда вы можете так же легко (или более просто) поместить эту команду в сценарий оболочки?
Цифровая травма
1
Не эксперт в этом, но нельзя ли что-то подобное (надеюсь, что-то более полезное) поместить в / usr / local / bin?
Джо
2
Даже если это МОЖЕТ работать, оно не должно идти в / usr / local / bin, так как оно специфично для одного пользователя.
Йохан