'::' çift sütun içeren Bash komut dosyası işlev adları


17

Bugün, içinde çift sütun ::bulunan işlev adlarına sahip bir Bash komut dosyası ile karşılaştım , örneğin, file::write()vefile::read() . Daha önce bir Bash betiğinde bu sözdizimini hiç görmedim ve betiği çağırdığımda gayet iyi koştu (sürprizime).

Sistemimde (ve çevrimiçi) Bash'ın kılavuz sayfasını inceledikten sonra, dokümanlarda işlev adları için bu sözdizimini destekleyen hiçbir şey bulamıyorum. Örneğin, bölüm Shell Defined Functions, bir kabuk işlevinin sözdizimini

function name [()] compound-command [redirection]

ve daha sonra (başka bir yere kılavuzunu) belirteci nameolarak tanımlanmaktadır

name   A word consisting only of alphanumeric characters and
       underscores, and beginning with an alphabetic character
       or an underscore.  Also referred to as an identifier.

İşlev adları için çift kolon sözdiziminin hiçbir yerinde söz edilmez.

Şimdiye kadar bulduğum bu çift kolon sözdizimine diğer tek referans , "paketlerde" işlev adları için çift kolon sözdiziminin kullanılmasını öneren bu Kabuk Stil Kılavuzu'ndadır (alt bölüme bakın Naming Conventions > Function Names) - örn mypackage::myfunction().

İşlev adları için bu çift kolon sözdizimi, Bash kabuğunun meşru bir özelliği mi, yoksa belki de belgelenmemiş bir özellik mi? Yasalsa, Bash kılavuzunda nerede belgelenmiştir? Baktım ve baktım ama kılavuzda hiçbir şey bulamıyorum. En yakın Ben ettik arasından kullanılmasıdır ::içinde PATHarama yoluna Geçerli çalışma dizini eklemek için ortam değişkeni.

MİSAL

#!/bin/bash
function abc::def() {
    echo "${FUNCNAME[0]}"
}
abc::def

Bu komut dosyasını üç farklı Linux dağıtımında test ettim ve her üçünde de komut dosyası abc::defstdout'a yazdırıyor .




Bağlantılar için teşekkürler. Garip. Göndermeden önce "bash double colon" (tırnak işaretleri olmadan) aradım ama hiçbir şey bulamadım. Zaten cevaplanmış bir soruyu tekrar sormaktan dolayı özür dileriz. .
Jim Fischer

Yanıtlar:


16

Bu, muhtemelen tabanca faktörünü düşürmek amacıyla, belgelerin uygulamadan daha katı olması durumudur. Bu daha önce burada tartışılmıştı ; örneğin geçerli bir işlev adı olduğunu belirten kapsamlı testlere de bakın [}{.

abc::defGeçerli bir değişken adı olmadığını da belirtmek gerekir :

$ abc::def=foo
bash: abc::def=foo: command not found

4
Sadece son derece açık hale getirmek için - değil file::readne de [}{geçerli posix olduğunu
Steven Penny
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.