Sonra ilk argüman sh -c inline-script
gider $0
(hata mesajları için de kullanılır) ve geri kalanı içeri girer $1
, $2
...
$ sh -c 'blah; echo "$0"; echo "$1"' my-inline-script arg
my-inline-script: blah: command not found
my-inline-script
arg
Yani istediğiniz:
sh -c 'find "$1"' sh /tmp
(eski günlerde, sh
ilk argümanın devreye girdiği uygulamalar bulabilirdiniz $1
, böylece şunları yapabilirsiniz:
sh -c 'find "$1"' /tmp /tmp
Veya:
sh -c 'shift "$2"; find "$@"' sh 3 2 /tmp1 /tmp2
ancak bu mermiler POSIX'in yaygın ve halka açık olduğu için artık yok oldu).
Eğer sette istiyorsanız $1
, $2
siz işlevlerini kullanmak istiyorum nerede şimdiki kabuğun içinde yerel bir kapsamda, bu. Bourne benzeri mermilerde:
my_func() {
find "$1"
}
my_func /tmp
Bazı mermiler anonim işlevleri destekler. Durum böyle zsh
:
(){find "$1"} /tmp
Veya es
:
@{find $1} /tmp
Mevcut konum parametrelerini kalıcı olarak değiştirmek için sözdizimi kabuğa bağlıdır. dchirikov zaten Bourne gibi kabuklarına kapsamış (Bourne, Korn, bash
, zsh
, POSIX, ash
, yash
...).
Sözdizimi:
set arg1 arg2 ... argn
Ancak, şunlara ihtiyacınız vardır:
set --
Bu listeyi boşaltmak (veya shift "$#"
) ve
set -- -foo
veya $1
ile başlayan bir şeye ayarlamak için , özellikle konumsal parametre listesinin sonuna argüman eklemek gibi rastgele veriler kullanırken her zaman kullanmak iyi bir alışkanlıktır .-
+
set --
set -- "$@" other-arg
csh
Ailenin kabuklarında ( csh
, tcsh
) argv
diziye atarsınız :
set argv=(arg1 arg2)
Kabuklarında rc
ailesi ( rc
, es
, akanga
), için *
diziden:
*=(arg1 arg2)
Öğeleri ayrı ayrı da atayabilirsiniz:
2=arg2
İçinde fish
, konum parametreleri sadeceargv
dizidedir (hayır , orada):$1
$@
set argv arg1 arg2
İle zsh
uyumluluk csh
için argv
diziye de atayabilirsiniz :
argv=(arg1 arg2)
argv[4]=arg4
Ayrıca şunları da yapabilirsiniz:
5=arg5
Bu, aşağıdakileri de yapabileceğiniz anlamına gelir:
argv+=(another-arg)
sonuna bir argüman eklemek için ve:
argv[-1]=()
argv[2]=()
diğer kabuklarla kolayca yapamayacağınız bir argümanı uçtan veya ortadan kaldırmak için.
(find $1) /tmp
bir sözdizimi hatasıdır. Aslında(any-command) more-arguments
bir sözdizimi hatasıdır. Ne yapmaya çalıştığınızı farklı açıklayabilir misiniz?