Сделать псевдоним Bash, который принимает параметр?

Я использовал CShell ( csh), который позволяет создавать псевдоним, который принимает параметр. Запись была что-то вроде

alias junk="mv \\!* ~/.Trash"

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

27 ответов

Решение

Псевдоним Bash напрямую не принимает параметры. Вам нужно будет создать функцию и псевдоним.

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

myfunction() {
    #do things with parameters like $1 such as
    mv "$1" "$1.bak"
    cp "$2" "$1"
}


myfunction old.conf new.conf #calls `myfunction`

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

$ myfunction original.conf my.conf

Уточняя ответ выше, вы можете получить 1-строчный синтаксис, как и для псевдонимов, что более удобно для специальных определений в оболочке или файлах.bashrc:

bash$ myfunction() { mv "$1" "$1.bak" && cp -i "$2" "$1"; }

bash$ myfunction original.conf my.conf

Не забывайте точку с запятой перед закрывающей правой скобкой. Аналогично, для актуального вопроса:

csh% alias junk="mv \\!* ~/.Trash"

bash$ junk() { mv "$@" ~/.Trash/; }

Или же:

bash$ junk() { for item in "$@" ; do echo "Trashing: $item" ; mv "$item" ~/.Trash/; done; }

Вопрос просто задан неправильно. Вы не делаете псевдоним, который принимает параметры, потому что alias просто добавляет второе имя для того, что уже существует. Функциональность, которую хочет ОП - это function Команда для создания новой функции. Вам не нужно псевдоним функции, так как функция уже имеет имя.

Я думаю, что вы хотите что-то вроде этого:

function trash() { mv "$@" ~/.Trash; }

Это оно! Вы можете использовать параметры $1, $2, $3 и т. Д. Или просто заполнить их все $@

TL;DR: сделать это вместо

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

$ wrap_args() { echo "before $@ after"; }
$ wrap_args 1 2 3
before 1 2 3 after

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

осветление

bash псевдонимы принимают аргументы, но только в конце:

$ alias speak=echo
$ speak hello world
hello world

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

Не пытайтесь делать это дома, детки!

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

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

Решение 1

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

$ alias wrap_args='f(){ echo before "$@" after;  unset -f f; }; f'
$ wrap_args x y z
before x y z after

Вы можете заменить $@ с $1 если вы хотите только первый аргумент.

Объяснение 1

Это создает временную функцию f, которому передаются аргументы (обратите внимание, что f называется в самом конце). unset -f удаляет определение функции, так как псевдоним выполняется, чтобы потом не зависать.

Решение 2

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

$ alias wrap_args='sh -c '\''echo before "$@" after'\'' _'

Объяснение 2

Псевдоним создает команду вроде:

sh -c 'echo before "$@" after' _

Комментарии:

  • Заполнитель _ требуется, но это может быть что угодно. Он настроен на sh "s $0 и требуется, чтобы первый из заданных пользователем аргументов не использовался. Демонстрация:

    sh -c 'echo Consumed: "$0" Printing: "$@"' alcohol drunken babble
    Consumed: alcohol Printing: drunken babble
    
  • Одиночные кавычки внутри одинарных кавычек обязательны. Вот пример того, как он не работает с двойными кавычками:

    $ sh -c "echo Consumed: $0 Printing: $@" alcohol drunken babble
    Consumed: -bash Printing:
    

    Здесь значения интерактивной оболочки $0 а также $@ заменяются на двойные кавычки, прежде чем он будет передан sh, Вот доказательство:

    echo "Consumed: $0 Printing: $@"
    Consumed: -bash Printing:
    

    Одинарные кавычки гарантируют, что эти переменные не интерпретируются интерактивной оболочкой и передаются буквально sh -c,

    Вы можете использовать двойные кавычки и \$@, но лучше всего указывать свои аргументы (так как они могут содержать пробелы), и \"\$@\" выглядит еще страшнее, но может помочь вам выиграть конкурс на запутывание, в котором запутанные волосы являются обязательным условием для участия.

Все, что вам нужно сделать, это сделать функцию внутри псевдонима:

$alias mkcd='function _mkcd(){mkdir "$1"; cd "$1"}; _mkcd'

Вы должны поместить двойные кавычки вокруг "1 $", потому что одинарные кавычки не будут работать.

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

alias cp="~/SCR/spiner cp"

А это скрипт спинера

#!/bin/bash

#Set timer
T=$(date +%s)

#Add some color
. ~/SCR/color

#Animation sprites
sprite=( "(* )  ( *)" " (* )( *) " " ( *)(* ) " "( *)  (* )" "(* )  ( *)" )

#Print empty line and hide cursor
printf "\n${COF}"

#Exit function
function bye { printf "${CON}"; [ -e /proc/$pid ] && kill -9 $pid; exit; }; trap bye INT

#Run our command and get its pid
"$@" & pid=$!

#Waiting animation
i=0; while [ -e /proc/$pid ]; do sleep 0.1

    printf "\r${GRN}Please wait... ${YLW}${sprite[$i]}${DEF}"
    ((i++)); [[ $i = ${#sprite[@]} ]] && i=0

done

#Print time and exit
T=$(($(date +%s)-$T))
printf "\n\nTime taken: $(date -u -d @${T} +'%T')\n"

bye

Это похоже на это

Циклическая анимация)

Вот ссылка на упомянутый выше цветной скрипт. И новый цикл анимации)

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

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

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

Синтаксис:

      alias shortName="your custom command here"

Пример:

      alias tlogs='_t_logs() { tail -f ../path/$1/to/project/logs.txt ;}; _t_logs'

Псевдоним Bash абсолютно не принимает параметры. Я просто добавил псевдоним для создания нового приложения для реагирования, которое принимает имя приложения в качестве параметра. Вот мой процесс:

Откройте bash_profile для редактирования в nano

nano /.bash_profile

Добавьте свои псевдонимы, по одному в строке:

alias gita='git add .'
alias gitc='git commit -m "$@"'
alias gitpom='git push origin master'
alias creact='npx create-react-app "$@"'

примечание: "$@" принимает параметры, переданные как "creact my-new-app"

Сохраните и выйдите из редактора nano

ctrl+o для записи (нажмите Enter); ctrl+x для выхода

Сообщите терминалу, что нужно использовать новые псевдонимы в.bash_profile

source /.bash_profile

Это оно! Теперь вы можете использовать свои новые псевдонимы

Вот три примера функций, которые у меня есть в моем ~/.bashrc это псевдонимы, которые принимают параметр:

#Utility required by all below functions.
#https://stackru.com/questions/369758/how-to-trim-whitespace-from-bash-variable#comment21953456_3232433
alias trim="sed -e 's/^[[:space:]]*//g' -e 's/[[:space:]]*\$//g'"

,

:<<COMMENT
    Alias function for recursive deletion, with are-you-sure prompt.

    Example:
        srf /home/myusername/django_files/rest_tutorial/rest_venv/

    Parameter is required, and must be at least one non-whitespace character.

    Short description: Stored in SRF_DESC

    With the following setting, this is *not* added to the history:
        export HISTIGNORE="*rm -r*:srf *"
    - https://superuser.com/questions/232885/can-you-share-wisdom-on-using-histignore-in-bash

    See:
    - y/n prompt: https://stackru.com/a/3232082/2736496
    - Alias w/param: https://stackru.com/a/7131683/2736496
COMMENT
#SRF_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
SRF_DESC="srf [path]: Recursive deletion, with y/n prompt\n"
srf()  {
    #Exit if no parameter is provided (if it's the empty string)
        param=$(echo "$1" | trim)
        echo "$param"
        if [ -z "$param" ]  #http://tldp.org/LDP/abs/html/comparison-ops.html
        then
          echo "Required parameter missing. Cancelled"; return
        fi

    #Actual line-breaks required in order to expand the variable.
    #- https://stackru.com/a/4296147/2736496
    read -r -p "About to
    sudo rm -rf \"$param\"
Are you sure? [y/N] " response
    response=${response,,}    # tolower
    if [[ $response =~ ^(yes|y)$ ]]
    then
        sudo rm -rf "$param"
    else
        echo "Cancelled."
    fi
}

,

:<<COMMENT
    Delete item from history based on its line number. No prompt.

    Short description: Stored in HX_DESC

    Examples
        hx 112
        hx 3

    See:
    - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string
COMMENT
#HX_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
HX_DESC="hx [linenum]: Delete history item at line number\n"
hx()  {
    history -d "$1"
}

,

:<<COMMENT
    Deletes all lines from the history that match a search string, with a
    prompt. The history file is then reloaded into memory.

    Short description: Stored in HXF_DESC

    Examples
        hxf "rm -rf"
        hxf ^source

    Parameter is required, and must be at least one non-whitespace character.

    With the following setting, this is *not* added to the history:
        export HISTIGNORE="*hxf *"
    - https://superuser.com/questions/232885/can-you-share-wisdom-on-using-histignore-in-bash

    See:
    - https://unix.stackexchange.com/questions/57924/how-to-delete-commands-in-history-matching-a-given-string
COMMENT
#HXF_DESC: For "aliaf" command (with an 'f'). Must end with a newline.
HXF_DESC="hxf [searchterm]: Delete all history items matching search term, with y/n prompt\n"
hxf()  {
    #Exit if no parameter is provided (if it's the empty string)
        param=$(echo "$1" | trim)
        echo "$param"
        if [ -z "$param" ]  #http://tldp.org/LDP/abs/html/comparison-ops.html
        then
          echo "Required parameter missing. Cancelled"; return
        fi

    read -r -p "About to delete all items from history that match \"$param\". Are you sure? [y/N] " response
    response=${response,,}    # tolower
    if [[ $response =~ ^(yes|y)$ ]]
    then
        #Delete all matched items from the file, and duplicate it to a temp
        #location.
        grep -v "$param" "$HISTFILE" > /tmp/history

        #Clear all items in the current sessions history (in memory). This
        #empties out $HISTFILE.
        history -c

        #Overwrite the actual history file with the temp one.
        mv /tmp/history "$HISTFILE"

        #Now reload it.
        history -r "$HISTFILE"     #Alternative: exec bash
    else
        echo "Cancelled."
    fi
}

Рекомендации:

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

псевдоним mycommand = "python3 "$1" script.py --folderoutput РЕЗУЛЬТАТЫ /"

когда я затем запустил mycommand foobar, он работал так же, как если бы я набрал команду от руки.

NB: В случае, если идея не очевидна, плохая идея использовать псевдонимы для чего-либо, кроме псевдонимов, первый из которых - "функция в псевдониме", а второй - "трудно читаемый редирект / источник". Кроме того, есть недостатки (которые, я думал, будут очевидны, но на случай, если вы запутаетесь: я не имею в виду, что они действительно будут использоваться... где угодно!)

................................................................................................................................................

Я отвечал на это раньше, и всегда было так в прошлом:

alias foo='__foo() { unset -f $0; echo "arg1 for foo=$1"; }; __foo()'

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

alias bar='cat <<< '\''echo arg1 for bar=$1'\'' | source /dev/stdin'

Они оба примерно одинаковой длины дают или принимают несколько символов.

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

arg1 for foo=FOOVALUE
 real 0m0.011s user 0m0.004s sys 0m0.008s  # <--time spent in foo
 real 0m0.000s user 0m0.000s sys 0m0.000s  # <--time spent in bar
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.010s user 0m0.004s sys 0m0.004s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.011s user 0m0.000s sys 0m0.012s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.012s user 0m0.004s sys 0m0.004s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE
ubuntu@localhost /usr/bin# time foo FOOVALUE; time bar BARVALUE
arg1 for foo=FOOVALUE
 real 0m0.010s user 0m0.008s sys 0m0.004s
 real 0m0.000s user 0m0.000s sys 0m0.000s
arg1 for bar=BARVALUE

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

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

#!/usr/bin/env bash

# you would want to `source` this file, maybe in your .bash_profile?
function runjar_fn(){
    java -jar myjar.jar "$@";
}

alias runjar=runjar_fn;

Так что в приведенном выше примере я передаю все параметры, когда я запускаю runjar к псевдониму.

Например, если бы я сделал runjar hi there это в конечном итоге на самом деле работает java -jar myjar.jar hi there, Если бы я сделал runjar one two three это будет работать java -jar myjar.jar one two three,

Мне это нравится $@ решение, потому что оно работает с любым количеством параметров.

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

В терминале:

      $ alias <name_of_your_alias>_$argname="<command> $argname"

и использовать его:

      $<name_of_your_alias>_$argname

например, псевдоним cat файл под названием hello.txt:

  • (псевдоним CAT_FILE_)
  • и $f (это $argname, который в этом примере является файлом)
      $ alias CAT_FILE_$f="cat $f"

$ echo " " >> hello.txt
$ echo "hello there!" >> hello.txt
$ echo " " >> hello.txt
$ cat hello.txt

    hello there!

Контрольная работа:

      CAT_FILE_ hello.txt

Существуют законные технические причины, чтобы хотеть обобщенного решения проблемы псевдонима bash, не имеющего механизма для принятия произвольных аргументов. Одна из причин заключается в том, что на команду, которую вы хотите выполнить, негативно повлияют изменения в среде, возникшие в результате выполнения функции. Во всех остальных случаях следует использовать функции.

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

FUNCNAME BASH_SOURCE BASH_LINENO BASH_ARGC BASH_ARGV

Основная команда, которую я использовал (в функции) для печати переменных defns. в форме вывода командой set было:

sv () { set | grep --color=never -- "^$1=.*"; }

Например:

> V=voodoo
sv V
V=voodoo

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

> sv FUNCNAME
FUNCNAME=([0]="sv")

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

alias asv='(grep -- "^$(cat -)=.*" <(set)) <<<'

Что дает правильный вывод (нет) и статус результата (ложь):

> asv FUNCNAME
> echo $?
1

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

Общее решение для передачи произвольных аргументов команде с псевдонимом Bash:

# (I put this code in a file "alias-arg.sh"):

# cmd [arg1 ...] – an experimental command that optionally takes args,
# which are printed as "cmd(arg1 ...)"
#
# Also sets global variable "CMD_DONE" to "true".
#
cmd () { echo "cmd($@)"; declare -g CMD_DONE=true; }

# Now set up an alias "ac2" that passes to cmd two arguments placed
# after the alias, but passes them to cmd with their order reversed:
#
# ac2 cmd_arg2 cmd_arg1 – calls "cmd" as: "cmd cmd_arg1 cmd_arg2"
#
alias ac2='
    # Set up cmd to be execed after f() finishes:
    #
    trap '\''cmd "${CMD_ARGV[1]}" "${CMD_ARGV[0]}"'\'' SIGUSR1;
    #        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    #       (^This is the actually execed command^)
    #
    # f [arg0 arg1 ...] – acquires args and sets up trap to run cmd:
    f () {
        declare -ag CMD_ARGV=("$@");  # array to give args to cmd
        kill -SIGUSR1 $$;             # this causes cmd to be run
        trap SIGUSR1;                 # unset the trap for SIGUSR1
        unset CMD_ARGV;               # clean up env...
        unset f;                      # incl. this function!
    };
    f'  # Finally, exec f, which will receive the args following "ac2".

Например:

> . alias-arg.sh
> ac2 one two
cmd(two one)
>
> # Check to see that command run via trap affects this environment:
> asv CMD_DONE
CMD_DONE=true

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

Например,

Если вы хотите "$@", используйте "${CMD_ARGV[@]}".

Если вы хотите "$#", используйте "${#CMD_ARGV[@]}".

И т.п.

Вы можете создать анонимную функцию внутри своего псевдонима:

      alias mkcd='(){mkdir "$1";cd "$1";}'

Вам нужно вокруг$1для обработки имен с пробелами в них. Внешний'избежать необходимости побега и$. Вы также можете использовать все"с кучей побегов:

      alias mkcd="(){mkdir \"\$1\";cd \"\$1\";}"

Я думаю, что это чище, чем несколько других ответов, создающих именованную функцию.

Любой из них имеет одинаковое использование.mkcd fooволяmkdir "foo"с последующимcd "foo"

Решение с подкомандами:

      d () {
    if [ $# -eq 0 ] ; then
        docker
        return 0
    fi
    CMD=$1
    shift

    case $CMD in
    p)
        docker ps --all $@
        ;;
    r)
        docker run --interactive --tty $@
        ;;
    rma)
        docker container prune
        docker image prune --filter "dangling=true"
        ;;
    *)
        docker $CMD $@
        ;;
    esac
    return $?
}

С использованием:

      $ d r my_image ...

Называется:

      docker run --interactive --tty my_image ...

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

alias rm="mv "$1" -t ~/.Trash/"

Конечно, сначала вам нужно создать каталог ~/.Trash.

Затем просто дайте следующую команду:

$rm <filename>
$rm <dirname>

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

Однако есть другой подход, использующий xargs:

alias junk="xargs -I "{}" -- mv "{}" "~/.Trash" <<< "

Обратите внимание, что это имеет побочные эффекты в отношении перенаправления потоков.

Вот пример:

alias gcommit='function _f() { git add -A; git commit -m "$1"; } ; _f'

Очень важный:

  1. После { и раньше }.
  2. E сть ;после каждой команды по порядку. Если вы забудете это после последней команды, вы увидите> подскажите вместо этого!
  3. Аргумент заключен в кавычки как "$1"

Вот еще один подход с использованием read. Я использую это для грубого поиска файла по фрагменту его имени, игнорируя сообщения «доступ запрещен».

      alias loc0='{ IFS= read -r x; find . -iname "*" -print 2>/dev/null | grep $x;} <<<'

Простой пример:

      $ { IFS= read -r x; echo "1 $x 2 ";} <<< "a b"
1 a b 2 

Обратите внимание, что это преобразует аргумент как строку в переменную (и). Для этого можно использовать несколько параметров в кавычках, разделенных пробелами:

      $ { read -r x0 x1; echo "1 ${x0} 2 ${x1} 3 ";} <<< "a b"
1 a 2 b 3 

На самом деле, функции почти всегда являются ответом, который уже достаточно подробно описан в цитате из справочной страницы: "Практически для любых целей псевдонимы заменяются функциями оболочки".

Для полноты и потому, что это может быть полезно (немного более легкий синтаксис), можно отметить, что, когда параметр (и) следуют за псевдонимом, они все еще могут использоваться (хотя это не будет соответствовать требованию OP). Это, вероятно, проще всего продемонстрировать на примере:

alias ssh_disc='ssh -O stop'

позволяет мне печатать что-то вроде ssh_disc myhost, который расширяется, как ожидается, как: ssh -O stop myhost

Это может быть полезно для команд, которые принимают сложные аргументы (моя память уже не та, что используется)...

Для получения параметров, вы должны использовать функции!

Однако $@ интерпретируется при создании псевдонима, а не во время выполнения псевдонима, и экранирование $ также не работает. Как мне решить эту проблему?

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

function foo() { /path/to/command "$@" ;}

ИЛИ ЖЕ

foo() { /path/to/command "$@" ;}

Наконец, вызовите вашу функцию foo(), используя следующий синтаксис:

foo arg1 arg2 argN

Убедитесь, что вы добавили свой foo() в ~/.bash_profile или же ~/.zshrc файл.

В вашем случае это будет работать

function trash() { mv $@ ~/.Trash; }

Хотя функция обычно является хорошим выбором, как говорили другие. Но я хотел бы отметить, что есть случаи, когда функция не работает, а псевдоним делает, или другие случаи, сценарий-обертка - лучший выбор.

псевдоним работает, функция - нет, и все же можно передавать параметры.

Например: я хочу сделать ярлык для активации conda и источник среды conda в одной команде. Было бы соблазн сделать это:

function conda_activate(){
    export PATH="$PATH:/path/to/conda"
    envname=$1
    if [ "x$envname" -ne "x" ]; then
       source activate "$envname"
    fi
}

Это не работает, как задумано. Если один побежал conda_activate myenv, source Команда выполняет поиск, но немедленно завершает работу, и у запущенной оболочки нет среды.

Рабочее решение выглядит так:

function conda_activate(){
    export PATH="$PATH:/path/to/conda"
    # do some other things
}
alias conda_env='conda_activate; source activate'
# usage example
conda_env myenv

скрипт-обёртка - лучший выбор

Несколько раз со мной случалось, что псевдоним или функция не могут быть найдены при входе через ssh или с включением переключения имен пользователей или многопользовательской среды. Существуют советы и рекомендации по работе с файлами точек поиска, например, этот интересный: alias sd='sudo ' позволяет это alias install='sd apt-get install' работать как положено Обратите внимание на дополнительное место в sd='sudo ', Но когда вы сомневаетесь, скрипт-обертка всегда является наиболее надежным и переносимым решением.

Вам не нужно ничего делать, псевдоним делает это автоматически.

Например, если я хочу сделать параметр git pull origin master параметризованным, я могу просто создать псевдоним следующим образом:

alias gpull = 'git pull origin '

и при его вызове вы можете передать master (имя ветки) в качестве параметра, например:

gpull master
//or any other branch
gpull mybranch
      alias junk="delay-arguments mv _ ~/.Trash"

delay-arguments сценарий:

      #!/bin/bash

# Example:
# > delay-arguments echo 1 _ 3 4 2
# 1 2 3 4
# > delay-arguments echo "| o n e" _ "| t h r e e" "| f o u r" "| t w o"
# | o n e | t w o | t h r e e | f o u r

RAW_ARGS=("$@")

ARGS=()

ARG_DELAY_MARKER="_"
SKIPPED_ARGS=0
SKIPPED_ARG_NUM=0
RAW_ARGS_COUNT="$#"

for ARG in "$@"; do
  #echo $ARG
  if [[ "$ARG" == "$ARG_DELAY_MARKER" ]]; then
    SKIPPED_ARGS=$((SKIPPED_ARGS+1))
  fi
done

for ((I=0; I<$RAW_ARGS_COUNT-$SKIPPED_ARGS; I++)); do
  ARG="${RAW_ARGS[$I]}"
  if [[ "$ARG" == "$ARG_DELAY_MARKER" ]]; then
    MOVE_SOURCE_ARG_NUM=$(($RAW_ARGS_COUNT-$SKIPPED_ARGS+$SKIPPED_ARG_NUM))
    MOVING_ARG="${RAW_ARGS[$MOVE_SOURCE_ARG_NUM]}"
    #echo "Moving arg: $MOVING_ARG"
    ARGS+=("$MOVING_ARG")
    SKIPPED_ARG_NUM=$(($SKIPPED_ARG_NUM+1))
  else
    ARGS+=("$ARG")
  fi
done

#for ARG in "${ARGS[@]}"; do
  #echo "ARGN: $ARG"
#done

#echo "RAW_ARGS_COUNT: $RAW_ARGS_COUNT"
#echo "SKIPPED_ARGS: $SKIPPED_ARGS"

#echo "${ARGS[@]}"
QUOTED_ARGS=$(printf ' %q' "${ARGS[@]}")
eval "${QUOTED_ARGS[@]}"

Однако вам не нужны функции при создании псевдонимов в .bashrc файл. Например

# create an alias that takes port-number by the user
alias serve="python -m SimpleHTTPServer $1"

После внесения изменений в файл.bashrc обязательно введите следующую команду.

~$ source .bashrc

Вы должны быть в состоянии использовать это так

~$ serve 8998
Другие вопросы по тегам