Это зависит от текущей культуры текущей культуры потоков.
float.Parse("123,5", system.threading.thread.currentthread.currentculture);
float.Parse("123.5", system.threading.thread.currentthread.currentculture);
ЕСЛИ вы строго не хотите, чтобы специфические культуры были тогда
float.Parse("123.5", CultureInfo.InvariantCulture);
Псевдоним 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
Для принятия параметров вы должны использовать функции!
Однако $ @ get интерпретируется при создании псевдонима, а не во время выполнения псевдонима, а escape-код не работает. Как решить эту проблему?
Вам нужно использовать функцию оболочки вместо псевдонима, чтобы избавиться от этой проблемы. Вы можете определить foo следующим образом:
function foo() { /path/to/command "$@" ;}
ИЛИ
foo() { /path/to/command "$@" ;}
Наконец, вызовите ваш foo (), используя следующий синтаксис:
foo arg1 arg2 argN
Убедитесь, что вы добавили файл foo () в ~/.bash_profile
или ~/.zshrc
.
В вашем случае это будет работать
function trash() { mv $@ ~/.Trash; }
Альтернативным решением является использование marker - инструмента, который я создал недавно, который позволяет вам «закладок» шаблонов команд и легко помещать курсор в держатели команд:
[/g1]
Я обнаружил, что большую часть времени я использую функции оболочки, поэтому мне не нужно писать часто используемые команды снова и снова в командной строке. Проблема использования функций для этого варианта использования заключается в добавлении новых терминов в словарь моей команды и необходимости запоминать, какие параметры функций относятся к реальной команде. Цель маркера - устранить эту психическую нагрузку.
Вот три примера функций, которые у меня есть в моем ~/.bashrc
, которые являются по существу алиасами, которые принимают параметр:
#Utility required by all below functions.
#https://stackoverflow.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://stackoverflow.com/a/3232082/2736496
- Alias w/param: https://stackoverflow.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://stackoverflow.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
}
Ссылки:
Есть законные технические причины, чтобы хотеть обобщенного решения проблемы псевдонимов 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)) <<<'
Что дает правильный вывод (none) и статус результата (false):
> 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 [@]}».
Etc.
Вопрос просто задан неправильно. Вы не делаете псевдоним, который принимает параметры, потому что alias
просто добавляет второе имя для того, что уже существует. Функцией, требуемой OP, является команда function
для создания новой функции. Вам не нужно псевдонизировать функцию, поскольку функция уже имеет имя.
Я думаю, вы хотите что-то вроде этого:
function trash() { mv "$@" ~/.Trash; }
Вот и все! Вы можете использовать параметры $ 1, $ 2, $ 3 и т. Д. Или просто использовать их все с помощью $ @
echo -e '#!/bin/bash\nshopt -s expand_aliases\nalias asrc='\''echo "${BASH_SOURCE[0]}"'\'' # note the '\''s\nfunction fsrc(){ echo "${BASH_SOURCE[0]}";}'>>file2&&echo -e '#!/bin/bash\n. file2\nalias rl='\''readlink -f'\''\nrl $(asrc)\nrl $(fsrc)'>>file1&&chmod +x file1&&./file1;rm -f file1 file2
– Fuzzy Logic
9 May 2016 в 07:44
$@
для поддержки файлов с пробелами и т. Д.
– Tom Hale
28 March 2017 в 06:26
Однако вам не нужны функции при создании псевдонимов в файле .bashrc
. Например,
# create an alias that takes port-number by the user
alias serve="python -m SimpleHTTPServer $1"
После внесения изменений в файл .bashrc убедитесь, что вы вводите следующую команду:
~$ source .bashrc
Вы должны использовать это, как
~$ serve 8998
$1
расширяется, когда вы определяете псевдоним, потому что он находится внутри двойных кавычек. Поскольку он, вероятно, пуст, ваш псевдоним просто расширяется до python -m SimpleHTTPServer
. Единственная причина, по которой это работает, состоит в том, что параметры вашей команды находятся в конце, она не будет работать с параметрами посередине, как в проблеме OP.
– Barmar
29 January 2018 в 18:15
Если вы ищете общий способ применения всех параметров к функции, а не только одну или две или некоторые другие жестко закодированные суммы, вы можете сделать это следующим образом:
#!/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
.
Мне нравится это решение на $@
, потому что оно работает с любым количеством параметров.
runjar
вместо того, чтобы сделать ее псевдонимом для функции? Кажется излишне сложным!
– Evan Langlois
21 December 2015 в 19:34
alias
-ed (или имеющие свойства вещей, переданных в alias
) в файлах bash? если да, то это просто мой, не узнав, что
– Micah
22 December 2015 в 13:58
alias runjar='java -jar myjar.jar'
. Псевдонимы принимают аргументы, но только в конце.
– Tom Hale
26 February 2017 в 08:45
Исправляя ответ выше, вы можете получить синтаксис с 1 строкой, как вы можете, для псевдонимов, что более удобно для ad-hoc-определений в файлах оболочки или .bashrc:
bash$ myfunction() { mv "$1" "$1.bak"; cp "$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; }
mv "$1" "$1.bak"; cp "$2" "$1"
на mv "$1" "$1.bak" && cp "$2" "$1"
, чтобы не потерять свои данные, когда mv
попадает в неисправность (например, полная файловая система).
– Henk Langeveld
23 January 2016 в 13:10
NB: Если идея не очевидна, это плохая идея использовать псевдонимы для чего угодно, кроме псевдонимов, первая из которых является «функцией в псевдониме», а вторая - «трудно читаемой переадресацией / источник'. Кроме того, есть недостатки (которые, по мнению i , были очевидны, но на всякий случай вы сбиты с толку: я не хочу, чтобы они действительно использовались ... где угодно!) [/ G2]
.................................................. .................................................. ............................................
Я уже говорил об этом раньше, и в прошлом это всегда было так:
alias foo='__foo() { unset -f $0; echo "arg1 for foo=$1"; }; __foo()'
, что прекрасно и хорошо, если только вы не избегаете использования функций вместе. в этом случае вы можете воспользоваться огромной способностью bash перенаправлять текст:
alias bar='cat <<< '\''echo arg1 for bar=$1'\'' | source /dev/stdin'
Они оба примерно одинаковой длины дают или принимают несколько символов.
real кикер - это разница во времени, верхняя часть - это «метод функции», а нижняя - метод «перенаправление-источник». Чтобы доказать эту теорию, время говорит само за себя:
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 результатов, выполненных с произвольными интервалами. Кажется, что создание / уничтожение функции занимает больше времени, чем перенаправление. Надеюсь, это поможет будущим посетителям в этом вопросе (не хотел держать это в себе).
Функции практически всегда являются ответом, который уже достаточно внесен и подтвержден этой цитатой на странице руководства: «Для почти каждой цели псевдонимы заменяются функциями оболочки».
Для полноты и потому, что это может быть полезно (незначительно более легкий синтаксис), можно отметить, что когда параметр (ы) следуют за псевдонимом, они все равно могут использоваться (хотя это не будет касаться требования OP). Это, вероятно, проще всего продемонстрировать с помощью примера:
alias ssh_disc='ssh -O stop'
позволяет мне набирать smth like ssh_disc myhost
, который расширяется, как ожидалось, как: ssh -O stop myhost
Это может быть полезно для команд, которые принимают сложные аргументы (моя память не то, что она использует t больше) ...
. Его гораздо проще и читабельнее использовать функцию, чем псевдоним, чтобы поставить аргументы в середине команды.
$ wrap_args() { echo "before $@ after"; }
$ wrap_args 1 2 3
before 1 2 3 after
Если вы читаете, вы узнаете, что вам не нужно знать о обработке аргументов оболочки. Знание опасно. Просто получите желаемый результат, прежде чем темная сторона навсегда контролирует вашу судьбу.
bash
aliases do принимает аргументы, но только на end :
$ alias speak=echo
$ speak hello world
hello world
Ввод аргументов в средний команды через alias
действительно возможен, но он становится уродливым.
Если вам нравится обходить ограничения и делать то, что говорят другие, это рецепт. Просто не обвиняйте меня, если ваши волосы становятся измотаны, а ваше лицо заканчивается тем, что покрыто сухим безумным ученого.
Обходной путь состоит в том, чтобы передать аргументы, которые alias
принимает только в конце (g7) Решение 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
удаляет определение функции по мере того, как выполняется псевдоним, после чего он не зависает.
Вы также можете использовать подоболочку:
$ alias wrap_args='sh -c '\''echo before "$@" after'\'' _'
Пояснение 2
Псевдоним строит команду:
sh -c 'echo before "$@" after' _
Комментарии:
_
, но это может быть что угодно. Он устанавливается в sh
$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
. Вы можете использовать двойные кавычки и \$@
, но лучше всего привести свои аргументы (поскольку они могут содержать пробелы), а \"\$@\"
выглядит еще более уродливым, но может помочь вам выиграть конкурс по запутыванию, где измотанные волосы являются предпосылкой для запись.
$1
в кавычки? – Jürgen Paul 15 July 2013 в 07:43source
вашего .bashrc добавит эту функцию, но она не удалит старый псевдоним. Поскольку псевдонимы имеют более высокий прецедент, чем функции, он попытается использовать псевдоним. Вам нужно либо закрыть, либо снова открыть свою оболочку, либо вызватьunalias <name>
. Возможно, я спасу кого-то за 5 минут, которые я просто потратил впустую. – Marty Neal 21 May 2014 в 18:25exec bash
: он запустит новую оболочку, предоставив вам чистую информацию о ваших конфигурациях, точно так же, как если бы вы закрылись и снова открылись, но сохранили среду этого сеанса переменные настройки тоже. Кроме того, выполнениеbash
без exec может быть полезно, когда вы хотите обрабатывать мысли как стек. – Macneil Shonle 9 July 2014 в 17:39mv "$1" "$1.bak"
. без кавычек, если $ 1 был «hello world», вы выполнили быmv hello world hello world.bak
вместоmv "hello world" "hello world.bak"
. – orion elenzil 11 June 2015 в 16:17