Polecenie „quote” w powłoce

15

Jakie jest użycie polecenia quote? Nie znalazłem żadnych informacji na ten temat, nie ma go wśród plików wykonywalnych w /binfolderach i nie można go znaleźć wśród wbudowanych Bash. Wygląda na to, że wypisuje tylko swój pierwszy parametr, jak echopolecenie i nic więcej.

whtyger
źródło
dodaje tylko cytaty
Hakeem Wahab
1
Po prostu szukając, znalazłem narzędzie o nazwie shell-quote, które jest podobne do quote, ale ma pewne zastosowania z takimi rzeczami jak ssh i do debugowania skryptów bash. Pomyślałem, że dołączę to tutaj jako przypis. „ linux.die.net/man/1/shell-quote
Joe
Wydaje się, że WTF ma tak popularne słowo, quoteużywane w tak niejasnym celu ... Brak prefiksu oznaczającego go jako „wewnętrzny”, brak dokumentacji, nic, chyba że przejdziesz do szczegółów implementacji zaawansowanej mechaniki ukończenia dystrybucji. Trochę mnie to niepokoi.
hyde
Staje się jeszcze bardziej niejasny dla osoby, której językiem ojczystym nie jest angielski. Na przykład jak ja. :)
whtyger

Odpowiedzi:

10

Co to jest?

Zauważyłem, że to polecenie nie działa w mojej powłoce ( ryba, przyjazna interaktywna powłoka ). Wygląda na to, że działa tylko w trybie bash (domyślnie Ubuntu).

chocobai@pc ~> /bin/bash 
chocobai@pc:~$ quote asdf
'asdf'chocobai@pc:~$ 

chocobai@pc:~$ type quote
quote is a function.
quote ()
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

Co to robi? Do czego można go wykorzystać?

Dodaje cytaty, ale nie ma nowej linii. Unika także pojedynczych cudzysłowów w sposób odpowiedni dla bash. Przydaje się w skryptach cytowanie zmiennej lub innego rodzaju ciągu. Potrzebujesz tego na przykład dla ścieżek / parametrów ze spacjami. Chociaż są na to inne sposoby.

To naprawdę dziwne, że nie mogłem znaleźć żadnej dokumentacji (w sieci) na ten temat. Ale dobrze jest zobaczyć, co robi.

verpfeilt
źródło
2
whichjest bezużyteczny, zarówno w interaktywnych powłokach, jak i skryptach. Użyj typezamiast tego. type quotepowie ci, że jest to funkcja, a nawet wyświetli definicję funkcji. Uruchom help typewięcej na typewbudowanym.
geirha
Masz rację, dzięki. Zobaczyłem powyższą odpowiedź, która również użyła typu, aby dowiedzieć się, co to jest. Cóż, dzięki „który” wiedziałem, że nie był to plik wykonywalny w katalogu / bin /, ponieważ nie zwrócił żadnej ścieżki. Myślę, że to wciąż było przydatne. Ale masz rację, dodam typ.
verpfeilt
2
W moim Ubuntu 12.04 ta funkcja jest naprawdę opisana w /etc/bash_completion, która jest ~/.bashrcdomyślnie pozyskiwana , a nie /etc/bash.bashrctam, gdzie /etc/bash_completionkomentarz dotyczący tej sekcji jest komentowany. W /usr/share/bash-completion/systemie Ubuntu 12.04 nie ma również folderu.
whtyger
8

quotejest funkcją, która jest zdefiniowana (tutaj w moim systemie Debian, ale chyba tak samo jest w Ubuntu) w pliku /usr/share/bash-completion/bash_completion, który sam jest pozyskiwany /etc/bash.bashrcprzy starcie Basha.

Nigdy nie użyłbym tej funkcji! Jeśli chcesz zacytować rzeczy, aby były bezpieczne w użyciu dla powłoki, użyj printftego %qmodyfikatora, ponieważ:

printf '%q\n' "Hello my friend I like 'single quotes' as well as \"double quotes\""

W rzeczywistości, nawet to jest bardzo rzadko używane, zawsze są lepsze strategie dla rzeczy na wysokim poziomie, jak zwykle my, użytkownicy. Ta quoterzecz jest używana wewnętrznie przez niektóre niejasne rzeczy, o których nawet nie chcemy wiedzieć. Ta quotefunkcja jest prawdopodobnie specyficzna dla dostawcy / dystrybucji (czytaj specyficzna dla Debiana) i prawdopodobnie nie jest w ogóle przenośna, a może nawet ulec zmianie w przyszłych wydaniach.

Edytować. Właśnie sprawdziłem system Ubuntu 12.04, a quotefunkcja jest zdefiniowana w /etc/bash_completion, pochodzi z /etc/bash.bashrc, sama pochodzi z /etc/profile.

Jak to ustaliłem? używając trochę heurystyki:

  • Sprawdź, czy quotepojawia się w /etc/profile:

    grep '\bquote\b' /etc/profile

    Nie. Przejdź do następnego kroku.

  • Jakie pliki pochodzą /etc/profile?

    grep '[[:space:]]\.[[:space:]]' /etc/profile

    Mam $i(trzeba spojrzeć na źródła na co ten źródeł, ale w tym przypadku jest to pliki, /etc/profile.d/*.shjeśli w ogóle (i jeśli) i czytelny /etc/bash.bashrc. Patrząc w /etc/bash.bashrc.

  • Jest quotew /etc/bash.bashrc? tak / nie itd ...
gniourf_gniourf
źródło
quotefaktycznie unika pojedynczych cudzysłowów, więc jest użyteczny przez powłokę. Działa tak samo dobrze, jak printf %qw tym przypadku użycia.
Flimm,
Używaj @Flimm na własne ryzyko!
gniourf_gniourf
@gniourf_gniourf Myślę, że printf% q nie obsługuje poprawnie tyldy ( ~ ). Spróbuj tego: my_str='~/.bashrc'; echo ' Expected:' "$my_str"; bash -c "echo ' quote:' $(quote "$my_str")"; bash -c "echo 'printf %q:' $(printf '%q\n' "$my_str")". Będzie można zobaczyć coś podobnego Expected: ~/.bashrc, quote: ~/.bashrci printf %q: /home/your_username/.bashrc.
Rockallite
1
@Rockallite: Właśnie go wypróbowałem i działa zgodnie z oczekiwaniami ...
gniourf_gniourf
Jeśli chcesz przejść bezpośrednio do źródła, możesz użyć (shopt -s extdebug; declare -F quote), który podaje nazwę funkcji, numer linii, w której jest zdefiniowany, i nazwę pliku, w którym jest zdefiniowany.
wjandrea
3

quote jest funkcją:

quote () 
{ 
    local quoted=${1//\'/\'\\\'\'};
    printf "'%s'" "$quoted"
}

Ta funkcja jest zdefiniowana gdzieś w pliku inicjującym bash. Dokładniej, jeśli używasz Ubuntu 13.04, możesz go znaleźć w /usr/share/bash-completion/bash_completionlinii 142.

Aby to sprawdzić, użyj następującego polecenia:

type quote

Jego cel jest ewidentnie jasny.

Radu Rădeanu
źródło
To, co robi, jest jasne - ale dlaczego nie chcesz tego robić, może nie być. Dla uniknięcia wątpliwości: byłby używany do pobierania zmiennej, takiej jak $INPUT, która może zawierać spacje, cudzysłowy lub inne znaki, i zwracania ciągu, który jest zdecydowanie traktowany jako pojedynczy argument przez bash.
Ben XO