2012-04-17 19 views

Odpowiedz

14

Dowolna składnia arbitralna nie może być wykonana. Nawiasy są metaznakami, które mają specjalne znaczenie dla analizatora składni, więc nie ma możliwości użycia ich jako poprawnych nazw. Najlepszym sposobem rozszerzenia powłoki jest zdefiniowanie funkcji.

Byłby to podstawowy echo wrapper że zawsze pisze do tego samego pliku:

f() { 
    echo "[email protected]" 
} >a.txt 

To nie o to samo, ale dodatkowo obsługuje stdin - poświęcając echo's-e i -n opcje:

f() { 
    [[ ${1+_} || ! -t 0 ]] && printf '%s\n' "${*-$(</dev/fd/0)}" 
} >a.txt 

Które można nazwać jako

f arg1 arg2... 

lub

f <file 

Funkcje są przekazywane argumenty w taki sam sposób jak każdy inny poleceń.

Druga powłoka podobna do echa najpierw sprawdza, czy jest to set first argument, czy stdin pochodzący od nie-tty, i warunkowo wywołuje printf, używając parametrów pozycyjnych, jeśli jest ustawione, lub stdin. Wyrażenie testowe unika przypadku zarówno zerowych argumentów, jak i żadnego przekierowania z pliku, w takim przypadku Bash spróbuje rozszerzyć wyjście terminala, zawieszając powłokę.

+0

+1, dobra odpowiedź. Czy mógłbyś wyjaśnić bardziej szczegółowo, dlaczego używasz bardziej złożonej (ale lepszej) konstrukcji do wyprowadzenia argumentu (ów)? – Kaii

+0

Po prostu pozwala na wprowadzanie danych ze standardowego wejścia lub argumentów. Wyrażenie testowe zapobiega sytuacji, w której zarówno zera, jak i stdin pochodzą z terminala, w którym to przypadku powłoka musiałaby zostać zabita, ponieważ procesy własne tty są odczytywane i blokowane. Jeśli to nastąpi, parametry pozycyjne zostaną rozszerzone, jeśli zostaną ustawione, lub rozszerzenie zostanie odczytane z wejścia funkcji. Nieco bardziej przenośne, ale wolniejsze rozwiązanie jest możliwe dzięki 'cat' - wymaga to systemu z real/dev/fd/*. Właśnie napisałem tę sztuczkę, ponieważ moja poprzednia odpowiedź była taka sama jak innych. :) – ormaaj

+0

pozwala także na * wiele argumentów * tak samo jak 'echo'. Twoja funkcja działa z 'f jeden dwa trzy', podczas gdy inne działają tylko z' f 'jeden dwa trzy "'. Biorąc pod uwagę dane wejściowe bez qotes, inne rozwiązania uwzględniają tylko pierwsze słowo (tutaj: "jeden"). – Kaii

4
F() { 
    echo "$1" > a.txt 
} 

don Używaj nawiasów, gdy go nazwiesz. To jak to nazwać:

F "text to save" 
3

Tak, tylko należy nazwać z F sth:

F() 
{ 
    echo "$1" > a.txt 
} 

Czytaj więcej here.

Powiązane problemy