Perintah "quote" di shell

15

Apa gunanya perintah quote? Saya belum menemukan info tentang itu, itu bukan di antara file yang dapat dieksekusi di /binfolder, dan tidak dapat ditemukan di antara Bash built-in. Tampaknya hanya mencetak parameter pertamanya, seperti echoperintah dan tidak lebih.

whtyger
sumber
itu hanya menambahkan tanda kutip
Hakeem Wahab
1
Hanya mencari-cari, saya menemukan sebuah utilitas bernama shell-quote yang mirip dengan kutipan, tetapi memiliki beberapa kegunaan dengan hal-hal seperti ssh dan untuk debugging skrip bash. Kupikir aku akan memasukkannya di sini sebagai catatan kaki. ' linux.die.net/man/1/shell-quote '
Joe
Terasa seperti WTF memiliki kata yang umum quote, digunakan untuk tujuan yang tidak jelas ... Tidak ada awalan untuk menandainya "internal", tidak ada dokumentasi, tidak ada, kecuali Anda menggali rincian implementasi mekanisme penyelesaian lanjutan dari distro. Saya menemukan ini agak mengganggu.
hyde
Itu menjadi lebih tidak jelas bagi orang tersebut, yang bahasa ibunya bukan bahasa Inggris. Seperti saya, misalnya. :)
whtyger

Jawaban:

10

Apa itu?

Saya perhatikan bahwa perintah ini tidak berfungsi di shell saya ( ikan, shell interaktif ramah ). Sepertinya itu hanya berfungsi di bash (default 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"
}

Apa fungsinya? Untuk apa itu digunakan?

Itu menambahkan tanda kutip tetapi tidak ada baris baru. Itu juga lolos dari tanda kutip tunggal dengan cara yang cocok untuk bash. Ini dapat berguna dalam skrip untuk mengutip variabel atau jenis string lainnya. Anda memerlukan ini misalnya untuk jalur / parameter dengan spasi. Meskipun ada cara lain untuk melakukan ini.

Benar-benar aneh saya tidak dapat menemukan dokumentasi (di web) tentang itu. Tapi yah, mudah untuk melihat apa fungsinya.

palsu
sumber
2
whichtidak berguna, baik dalam shell interaktif maupun dalam skrip. Gunakan typesebagai gantinya. type quoteakan memberi tahu Anda itu fungsi, dan bahkan menunjukkan definisi fungsi. Jalankan help typeuntuk lebih banyak di typebuiltin.
geirha
Anda benar, terima kasih. Saya melihat jawaban di atas yang juga menggunakan tipe untuk mencari tahu apa itu. Yah, terima kasih kepada 'yang' saya tahu bahwa itu bukan executable di / bin / atau lebih, karena tidak mengembalikan jalur apa pun. Saya pikir itu masih berguna. Tapi Anda benar, saya akan menambahkan tipe.
verpfeilt
2
Di Ubuntu 12.04 saya fungsi ini benar-benar dijelaskan dalam /etc/bash_completion, yang bersumber ~/.bashrcsecara default, bukan oleh /etc/bash.bashrcbagian /etc/bash_completionyang berkomentar. Juga /usr/share/bash-completion/folder tidak ada dalam Ubuntu 12.04.
whtyger
8

quoteadalah fungsi yang didefinisikan (di sini di sistem Debian saya, tapi saya kira itu sama di Ubuntu) dalam file /usr/share/bash-completion/bash_completion, yang itu sendiri bersumber pada /etc/bash.bashrcsaat startup Bash.

Saya tidak akan pernah menggunakan fungsi ini! Jika Anda perlu mengutip hal-hal agar dapat digunakan dengan aman oleh shell, silakan gunakan printfdengan %qpengubah, seperti:

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

Bahkan, meskipun ini sangat jarang digunakan, selalu ada strategi yang lebih baik untuk barang-barang tingkat tinggi seperti yang biasanya dilakukan oleh kita, pengguna. Hal quoteini digunakan secara internal oleh beberapa hal tidak jelas yang bahkan tidak ingin kita ketahui. Ini quotefungsi mungkin vendor / distribusi khusus (baca Debian-spesifik) dan mungkin tidak portabel sama sekali, dan bahkan mungkin berubah dalam rilis mendatang.

Edit. Saya baru saja memeriksa sistem Ubuntu 12.04, dan quotefungsinya didefinisikan dalam /etc/bash_completion, bersumber oleh /etc/bash.bashrc, itu sendiri bersumber dari /etc/profile.

Bagaimana saya menentukan ini? menggunakan sedikit heuristik:

  • Periksa apakah quotemuncul di /etc/profile:

    grep '\bquote\b' /etc/profile

    Tidak. Pergi ke langkah selanjutnya.

  • Apa saja file yang bersumber /etc/profile?

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

    Saya punya $i(perlu melihat ke sumber untuk apa sumber ini, tetapi dalam hal ini adalah file /etc/profile.d/*.shjika ada (dan jika dapat dibaca) dan /etc/bash.bashrc. Melihat /etc/bash.bashrc.

  • Apakah quotedi /etc/bash.bashrc? ya / tidak, dll ...
gniourf_gniourf
sumber
quotebenar-benar lolos dari tanda kutip tunggal, sehingga dapat digunakan oleh shell. Ini berfungsi sama baiknya dengan printf %qkasus penggunaan ini.
Flimm
@Flimm gunakan dengan risiko Anda sendiri!
gniourf_gniourf
@ gniourf_gniourf Saya pikir printf% q tidak menangani tilde dengan benar ( ~ ). Coba ini: my_str='~/.bashrc'; echo ' Expected:' "$my_str"; bash -c "echo ' quote:' $(quote "$my_str")"; bash -c "echo 'printf %q:' $(printf '%q\n' "$my_str")". Anda akan melihat sesuatu seperti Expected: ~/.bashrc, quote: ~/.bashrcdan printf %q: /home/your_username/.bashrc.
Rockallite
1
@Rockallite: Saya baru mencobanya dan berhasil ...
gniourf_gniourf
Jika Anda ingin langsung beralih ke sumbernya, Anda dapat menggunakan (shopt -s extdebug; declare -F quote), yang memberi tahu Anda nama fungsi, nomor baris yang didefinisikan, dan nama file yang didefinisikan.
wjandrea
3

quote adalah fungsi:

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

Fungsi ini didefinisikan di suatu tempat di file inisialisasi bash. Lebih tepatnya, jika Anda menggunakan Ubuntu 13.04, Anda dapat menemukannya di /usr/share/bash-completion/bash_completionbaris 142.

Gunakan perintah berikut untuk memeriksanya:

type quote

Tujuannya jelas jelas.

Radu Rădeanu
sumber
Apa yang dilakukannya jelas - tetapi mengapa Anda ingin melakukannya mungkin tidak. Untuk menghindari keraguan: ini akan digunakan untuk mengambil variabel seperti $INPUT, yang mungkin berisi spasi, tanda kutip atau karakter lain, dan mengembalikan string yang jelas hanya diperlakukan sebagai argumen tunggal oleh bash.
Ben XO