Kabukta “alıntı” komutu


15

Komutun kullanımı nedir quote? Bu konuda herhangi bir bilgi bulamadım, /binklasörlerdeki yürütülebilir dosyalar arasında değil ve Bash yerleşikleri arasında bulunamıyor. Görünüşe göre sadece bir echokomut gibi ilk parametresini yazdırıyor ve daha fazlası değil.


sadece tırnak ekliyor
Hakeem Wahab

1
Sadece dürtmek, alıntıya benzer, ancak ssh ve bash komut dosyalarının hatalarını ayıklamak için bazı kullanımları olan kabuk-alıntı adı verilen bir yardımcı program buldum. Buraya dipnot olarak dahil edeceğimi düşündüm. ' linux.die.net/man/1/shell-quote '
Joe

Bu quotetür belirsiz bir amaç için kullanılan bir WTF, böyle ortak bir kelimeye sahip gibi hissediyor ... Distro'nun gelişmiş tamamlama mekaniğinin uygulama detaylarını kazmadığınız sürece, onu "dahili" olarak işaretlemek için önek yok, belge yok, hiçbir şey yok. Bunu biraz rahatsız edici buluyorum.
hyde

Ana dili İngilizce olmayan kişi için daha da belirsiz hale geliyor. Mesela benim gibi. :)
whtyger

Yanıtlar:


10

Bu ne?

Bu komutun kabuğumda ( balık, dost canlısı interaktif kabuk ) çalışmadığını fark ettim . Görünüşe göre sadece bash'de çalışıyor (Ubuntu'nun varsayılanı).

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"
}

Bu ne işe yarıyor? Ne için kullanılabilir?

Tırnak işaretleri ekler, ancak yeni satır içermez. Ayrıca bash için uygun bir şekilde tek tırnaklardan kaçar. Komut dosyalarında bir değişkeni veya başka bir dizeyi belirtmek yararlı olabilir. Örneğin boşluklu yollar / parametreler için buna ihtiyacınız vardır. Bunu yapmanın başka yolları olsa da.

Bu konuda herhangi bir belge bulamadığım gerçekten garip. Ama ne yaptığını görmek kolay.


2
whichhem etkileşimli kabuklarda hem de senaryolarda işe yaramaz. typeBunun yerine kullanın . type quotesize bir işlev olduğunu söyler ve hatta işlev tanımını gösterir. Yerleşiklerde help typedaha fazlası için koş type.
geirha

Haklısın, teşekkürler. Ben de ne olduğunu bulmak için türü kullanılan yukarıdaki cevabı gördüm. Peki, 'hang' sayesinde / bin / veya içinde çalıştırılabilir olmadığını biliyordum, çünkü herhangi bir yol döndürmedi. Bence hala faydalıydı. Ama haklısın, tip ekleyeceğim.
verpfeilt

2
Benim Ubuntu 12.04'te bu fonksiyon, ilgili bölümün nerede yorumlandığıyla değil, varsayılan /etc/bash_completionolarak kaynaklanmış olarak gerçekten açıklanmıştır . Ayrıca klasör Ubuntu 12.04'te mevcut değildir. ~/.bashrc/etc/bash.bashrc/etc/bash_completion/usr/share/bash-completion/
whtyger

8

quote/usr/share/bash-completion/bash_completionkendisi tarafından kaynaklanır dosyada (burada Debian sistemimde, ama sanırım Ubuntu'da aynıdır) tanımlanan bir işlevdir/etc/bash.bashrcBash'ın başlangıcında .

Bu işlevi asla kullanmam! Bir kabuk tarafından güvenli bir şekilde kullanılabilecek şeyler teklif etmeniz gerekiyorsa, lütfen değiştirici printfile birlikte kullanın %q:

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

Aslında, bu çok nadiren kullanılsa bile, bizler genellikle kullanıcılar gibi üst düzey şeyler için her zaman daha iyi stratejiler vardır. Bu quoteşey, dahili olarak bilmek bile istemediğimiz bazı belirsiz şeyler tarafından kullanılır. Bu quoteişlev muhtemelen bir satıcıya / dağıtıma özgüdür (Debian'a özgü okuyun) ve muhtemelen hiç taşınabilir değildir ve hatta gelecekteki sürümlerde değişebilir.

Düzenle. Ben sadece bir Ubuntu 12.04 sistemi üzerinde kontrol ettim ve quoteişlev tarafından tanımlanır /etc/bash_completion, kaynak tarafından /etc/bash.bashrc, kendisi tarafından kaynaklanır/etc/profile .

Bunu nasıl belirledim? biraz sezgisel kullanma:

  • Şunlarda quotegörünüp görünmediğini kontrol edin /etc/profile:

    grep '\bquote\b' /etc/profile

    Hayır. Bir sonraki adıma geçin.

  • Kaynaklar /etc/profilenelerdir?

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

    Ben $ibu ne kaynaklar için kaynağın içine bakmak (ihtiyacını ancak bu durumda dosyalar var /etc/profile.d/*.shise herhangi biri (ve okunabilir varsa) ve /etc/bash.bashrc. Looking /etc/bash.bashrc.

  • quoteiçinde /etc/bash.bashrc? evet / hayır, vb ...

quoteaslında tek tırnaktan kaçar, bu yüzden kabuk tarafından kullanılabilir. printf %qBu kullanım durumunda olduğu gibi çalışır .
Flimm

@Flimm kullanımı kendi sorumluluğunuzdadır!
gniourf_gniourf

@gniourf_gniourf Bence printf% q tilde ( ~ ) düzgün işlemiyor . Bu deneyin: my_str='~/.bashrc'; echo ' Expected:' "$my_str"; bash -c "echo ' quote:' $(quote "$my_str")"; bash -c "echo 'printf %q:' $(printf '%q\n' "$my_str")". Sen gibi bir şey görecekti Expected: ~/.bashrc, quote: ~/.bashrcve printf %q: /home/your_username/.bashrc.
Rockallite

1
@Rockallite: Sadece denedim ve beklenen bir iş ...
gniourf_gniourf

Doğrudan kaynağa atlamak (shopt -s extdebug; declare -F quote)istiyorsanız, işlev adını, tanımlandığı satır numarasını ve tanımlandığı dosya adını söyleyen kullanabilirsiniz .
wjandrea

3

quote bir işlevdir:

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

Bu işlev bash başlatma dosyasında bir yerde tanımlanır. Daha doğrusu, Ubuntu 13.04 kullanıyorsanız, /usr/share/bash-completion/bash_completion142 satırında bulabilirsiniz .

Kontrol etmek için aşağıdaki komutu kullanın:

type quote

Amacı açıktır.


Ne yapar açık - ama yapmak isteyeyim neden olmayabilir. Şüpheye yer bırakmamak için: $INPUTboşluk, tırnak işareti veya başka karakterler içerebilecek bir değişken almak ve kesinlikle bash tarafından tek bir argüman olarak değerlendirilen bir dizeyi döndürmek için kullanılır.
Ben XO
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.