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.


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.


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 ...

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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.