В большинстве систем Bash использует 64 -битные целые числа со знаком. Вам понадобится другой инструмент, такой как bc
, чтобы выйти за рамки этого.
Это означает, что с bash максимальное число, которое вы можете иметь, равно 2^63-1
, равно 9,223,372,036,854,775,807
, и вы превышаете это число:
awk 'BEGIN{print 2432902008176640000 * 21}'
51090942171709440000 #--> 51,090,942,171,709,440,000
В вашей функции оболочки program
используйте "$@"
для обращения к списку всех аргументов командной строки, переданных функции. С кавычками каждый аргумент командной строки, заданный для program
, будет дополнительно заключаться в кавычки (, обычно вам нужно ).
program () {
"$GOBIN"/program "$@"
}
Затем вы должны позвонить program
вот так:
program -p hello_world -tSu
или, если вы хотите пройти hello world
вместо hello_world
,
program -p 'hello world' -tSu
Использование $1
относится только к первому аргументу командной строки (, а $2
относится ко второму и т. д. ), как вы заметили. Значение $1
будет дополнительно разделено на пробелы -, и каждая сгенерированная строка будет подвергнута подстановке имени файла, поскольку расширение не заключено в кавычки. Это сделало бы невозможным правильную передачу аргумента, который содержит пробелы или шаблоны подстановки имен файлов, в функцию.
"$@"
— это способ передать все аргументы, полученные функцией/скриптом, как ответил Кусалананда.
Однако, учитывая, что вы, кажется, используете папку со своими программами go, я думаю, вам будет лучше просто добавить свою папку $GOBIN
в свой PATH:
export GOPATH="$HOME/go_projects"
export GOBIN="$GOPATH/bin"
export PATH="$PATH:$GOBIN"
Таким образом, вы можете запустить любую программу, хранящуюся в $GOBIN
, просто набрав ее имя (, если она не имеет того же имени, что и существующая программа, мы добавляем $GOBIN к $PATH, поэтому эти программы будут выбраны последними).
PS :Для полноты картины есть третий вариант, который заключается в использовании псевдонима вместо функции, которую вы можете поместить в.bashrc
:
alias program="$GOBIN/program"