Передача аргумента псевдониму в bash [дублировать]

StackOverflow https://stackoverflow.com/questions/4060880

  •  27-09-2019
  •  | 
  •  

Вопрос

На этот вопрос уже есть ответ здесь:

Можно ли сделать следующее:

Я хочу запустить следующее:

mongodb bin/mongod

В моем bash_profile у меня есть

alias = "./path/to/mongodb/$1"
Это было полезно?

Решение

Псевдоним будет расширяться в строку, которую он представляет. Что-то после того, как псевдоним появится после его расширения без необходимости быть или возможность передаваться как явные аргументы (например, $1).

$ alias foo='/path/to/bar'
$ foo some args

будет расширен до

$ /path/to/bar some args

Если вы хотите использовать явные аргументы, вам нужно использовать функцию

$ foo () { /path/to/bar "$@" fixed args; }
$ foo abc 123

будет выполнен, как если бы вы сделали

$ /path/to/bar abc 123 fixed args

Чтобы неофинировать псевдоним:

unalias foo

Чтобы неофинировать функцию:

unset -f foo

Чтобы увидеть тип и определение (для каждого определенного псевдонима, ключевого слова, функции, встроенного или исполняемого файла):

type -a foo

Или тип только (для возникновения высочайшего приоритета):

type -t foo

Другие советы

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

function __t2d {                                                                
         if [ "$1x" != 'x' ]; then                                              
            date -d "@$1"                                                       
         fi                                                                     
} 

alias t2d='__t2d'                                                               

чтобы использовать параметры в псевдонимах, я использую этот метод:

alias myalias='function __myalias() { echo "Hello $*"; unset -f __myalias; }; __myalias'

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

alias myalias='function __myalias() { echo "Hello $*"; myresult=$?; unset -f __myalias; return $myresult; }; __myalias'

итак..

вы могли бы, если вам нужно, чтобы эта переменная была там

alias mongodb='function __mongodb() { ./path/to/mongodb/$1; unset -f __mongodb; }; __mongodb'

конечно...

alias mongodb='./path/to/mongodb/'

на самом деле это сделало бы то же самое без необходимости в параметрах, но, как я уже сказал, если вы хотели или нуждались в них по какой-то причине (например, вам нужно было $ 2 вместо $ 1), вам нужно было бы использовать подобную оболочку.Если он больше одной строки, вы могли бы подумать о том, чтобы просто написать функцию напрямую, поскольку по мере увеличения она становилась все более неприятной для глаз.Функции великолепны, поскольку вы получаете все привилегии, которые дают функции (смотрите "Завершение", "Ловушки", "привязка" и т.д. О преимуществах, которые могут предоставить функции, на странице руководства bash).

Я надеюсь, что это поможет вам :)

Это решение, которое может избежать использования функции:

alias addone='{ num=$(cat -); echo "input: $num"; echo "result:$(($num+1))"; }<<<'

результат испытаний

addone 200
input: 200
result:201

В CSH (в отличие от башмак) Вы можете сделать именно то, что вы хотите.

alias print 'lpr \!^ -Pps5'
print memo.txt

Обозначения \!^ заставляет аргумент быть вставленным в команду на данный момент.

То ! персонаж предшествует \ Чтобы предотвратить интерпретацию как команду истории.

Вы также можете передавать несколько аргументов:

alias print 'lpr \!* -Pps5'
print part1.ps glossary.ps figure.ps

(Примеры, взятые из http://unixhelp.ed.ac.uk/shell/alias_csh2.1.html. .)

Чтобы упростить ответ LEED25D, используйте комбинацию псевдонима и функции. Например:

function __GetIt {
    cp ./path/to/stuff/$* .
}

alias GetIt='__GetIt'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top