Czy istnieje sposób, aby skompilowany program wiersza poleceń powiedział bashowi lub csh, że nie chce, aby w swoich parametrach były rozwijane żadne symbole wieloznaczne?
Na przykład, ktoś może potrzebować polecenia powłoki, takiego jak:
foo *
aby po prostu zwrócić numeryczną wartość ASCII tego znaku.
pwd
,echo *
jest po prostu*
nullglob
jest wyłączona, słowo pozostaje niezmienione. Jeślinullglob
opcja jest ustawiona i nie zostaną znalezione żadne dopasowania, słowo jest usuwane”.set -f
? Czy to jestunset -f
?set +f
Chociaż prawdą jest, że polecenie samo w sobie nie może wyłączyć globowania, możliwe jest, że użytkownik może powiedzieć powłoce Uniksa, aby nie globowała określonego polecenia. Zwykle jest to osiągane poprzez edycję plików konfiguracyjnych powłoki. Zakładając, że polecenie
foo
można znaleźć w ścieżce polecenia, do odpowiedniego pliku konfiguracyjnego należałoby dodać następujące elementy:W przypadku powłok sh, bash i ksh:
alias foo='set -f;foo';foo(){ command foo "$@";set +f;}
W przypadku powłok csh i tcsh:
alias foo 'set noglob;\foo \!*;unset noglob'
Dla powłoki zsh:
alias foo='noglob foo'
Ścieżka poleceń nie musi być używana. Powiedzmy, że polecenie foo jest przechowywane w katalogu ~ / bin, a powyższe wyglądałoby tak:
W przypadku powłok sh, bash i ksh:
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
W przypadku powłok csh i tcsh:
alias foo 'set noglob;$home/bin/foo \!*;unset noglob'
Dla powłoki zsh:
alias foo='noglob ~/bin/foo'
Wszystkie powyższe zostały przetestowane przy użyciu systemu Apple OSX 10.9.2. Uwaga: podczas kopiowania powyższego kodu należy uważać, aby usunąć wszelkie spacje. Mogą być znaczące.
Aktualizacja:
Użytkownik geira zwrócił uwagę, że w przypadku powłoki bash
alias foo='set -f;foo';foo(){ ~/bin/foo "$@";set +f;}
można zastąpić
reset_expansion(){ CMD="$1";shift;$CMD "$@";set +f;} alias foo='set -f;reset_expansion ~/bin/foo'
co eliminuje potrzebę funkcji foo.
Niektóre witryny internetowe użyte do utworzenia tego dokumentu:
Powłoka systemu Unix
Przekaż argumenty wiersza polecenia do polecenia Bash Alias
Csh - powłoka C.
Wbudowane polecenia Bash
Porównanie z sekwencjami startowymi powłoki Bourne'a i csh
Alias Loop w csh
Jak przekazać argumenty wiersza poleceń do aliasu powłoki?
Wywołanie programu, gdy funkcja bash ma taką samą nazwę
Specjalne zmienne powłoki
Aliasy powłoki C z argumentami wiersza poleceń
Zapobieganie rozszerzaniu / globalizacji symboli wieloznacznych w skryptach powłoki
źródło
Rozwinięcie jest wykonywane przez powłokę przed uruchomieniem programu. Twój program nie ma pojęcia, czy nastąpiła ekspansja, czy nie.
set -o noglob
wyłączy rozwijanie w wywołującej powłoce, ale musisz to zrobić przed wywołaniem programu.
Alternatywą jest cytowanie argumentów np
foo "*"
źródło
set -o noglob
do wyłączenia ekspansji symboli wieloznacznych.Uwaga: jeśli nie ma nazw pasujących do maski, bash przekazuje argument tak, jak jest, bez interpretacji!
Dowód (pa.py to bardzo prosty skrypt, który po prostu wypisuje swoje argumenty):
$ ls f1.cc f2.cc pa.py $ ./pa.py *.cc ['./pa.py', 'f1.cc', 'f2.cc'] $ ./pa.py *.cpp ['./pa.py', '*.cpp']
źródło
set -o nullglob
lubshopt -s failglob
, a to zachowanie się zmieni (na dwa bardzo różne sposoby).