Pro bash skript mohu použít "[email protected]"
pro přístup k argumentům. Jaký je ekvivalent, když používám alias?
Aliasy jsou jako příkazy v tom, že všechny argumenty k nim jsou předávány jako argumenty programu, který aliasují. Například, pokud jste měli alias ls
to ls -la
, poté zadejte ls foo bar
by opravd provést ls -la foo bar
na příkazovém řádku.
Pokud chcete mít skutečnou kontrolu nad tím, jak jsou argumenty interpretovány, můžete napsat takovou funkci:
my_program_wrapper() {
local first_arg="$1" \
second_arg="$2"
shift 2 # get rid of the first two arguments
# ...
/path/to/my_program "[email protected]"
}
Alias řešení
Pokud jste opravdu proti použití funkce per se, můžete použít:
$ alias wrap_args='f(){ echo before "[email protected]" after; unset -f f; }; f'
$ wrap_args x y z
before x y z after
Můžete nahradit [email protected]
s $1
pokud chcete pouze první argument.
Vysvětlení
Tím se vytvoří dočasná funkce f
, která je předána argumentům.
Argumenty aliasu se předávají pouze na konci. Všimněte si, že f
se volá na samém konci aliasu.
The unset -f
odebere definici funkce, protože je alias spuštěn, aby se poté nevěsil.
Kromě současných odpovědí je důležité si uvědomit, jak fungují aliasy, a to, že všechny parametry zadané po příkazu s aliasy budou použity doslova na konci. Neexistuje tedy způsob, jak použít alias pro dva příkazy (piped or not), z nichž první by měl interpretovat parametry. Abychom to vyjasnili, zde je příklad něčeho, co by nefungovalo podle očekávání:
alias lsswp="ls -l | grep swp"
(příklad inspirovaný tato otázka ), bude vždy použit výstup ls -l
provedeno v adresáři aktuální a udělejte na to grep - pomocí
lsswp/tmp /
by se rovnalo ls -l | grep swp /tmp/
a ne ls -l /tmp/ | grep swp
.
Pro všechny účely, kde by argumenty měly být použity někde uprostřed, je třeba použít function
místo alias
.
Vlastně nemusíte nic dělat; aliasy to dělají automaticky. Například:
$ alias less="less -eirqM"
$ less foo.txt
Uvidíte první stránku foo.txt a less
bude ukončeno na EOF (-e), vyhledávání nebudou rozlišovat velká a malá písmena (-i) atd.).
Odpovídám za csh:
Ano, můžete použít parametry v aliasech a - na rozdíl od toho, co bylo řečeno výše - se na ně můžete odkázat kdekoli v definici aliasu - nejen na konci.
Příklad pro tar-gz -ing:
$ alias tgz "tar cvf - \!:1 | gzip -9 > \!:2.tar.gz"
, kde !:1
a !:2
jsou parametry, které zadáte při volání svého aliasu.
Příklad použití:
$ ls
clrcf.dat user_comment_2016.06.03_12:51:50.txt user_comment_2016.06.03_12:54:48.txt
TEST-wADM.tec user_comment_2016.06.03_12:52:04.txt user_comment_2016.06.03_12:55:13.txt
$ tgz user* out
a user_comment_2016.06.03_12:51:50.txt 1K
a user_comment_2016.06.03_12:52:04.txt 1K
a user_comment_2016.06.03_12:54:48.txt 1K
a user_comment_2016.06.03_12:55:13.txt 1K
$ ls out*
out.tar.gz
Což efektivně znamená, že jste použili dva parametry, které jste vložili na libovolná místa příkazu tar, což z něj dělá alias tgz