Harici yardımcı programları çağırabilirsiniz (diğer yanıtlara bakın), ancak komut dosyanızı yavaşlatacaklar ve tesisat işlemini doğru yapmak zor.
zsh
Zsh'de, ${#$(readlink -f /etc/fstab)}
komut değişikliğinin uzunluğunu almak için yazabilirsiniz . Bunun komut çıktısının uzunluğu olmadığını, herhangi bir satırsonu olmadan çıkışın uzunluğu olduğunu unutmayın.
Çıktının tam uzunluğunu istiyorsanız, sonunda fazladan yeni olmayan bir karakter çıktılayın ve bir tane çıkarın.
$((${#$(readlink -f /etc/fstab; echo .)} - 1))
İstediğiniz şey komutun çıktısındaki yük ise, o zaman burada iki tane çıkarmanız gerekir , çünkü çıktısı readlink -f
kanonik yol artı bir yeni satırdır.
$((${#$(readlink -f /etc/fstab; echo .)} - 2))
Bu ${#$(readlink -f /etc/fstab)}
, kanonik yolun kendisinin bir satırsonu ile bittiği nadir ancak olası durumdan farklıdır .
Bu özel örnek için, harici bir yardımcı programa ihtiyacınız yoktur, zsh readlink -f
geçmiş değiştirici aracılığıyla eşdeğer bir yerleşik yapıya sahiptir A
.
echo /etc/fstab(:A)
Uzunluğu almak için parametre genişleticide geçmiş değiştiriciyi kullanın:
${#${:-/etc/fstab}:A}
Bir değişkente dosya adı varsa filename
, bu olur ${#filename:A}
.
Bourne / POSIX tarzı mermiler
Saf Bourne / POSIX mermilerinin hiçbirinde (Bourne, ash, mksh, ksh93, bash, yash…) bildiğim benzer bir uzantı yok. Komut ikamesinin çıkışına parametre ikamesi uygulamanız veya parametre ikamelerini iç içe yerleştirmeniz gerekiyorsa, ardışık aşamaları kullanın.
İsterseniz işlemi bir işleve doldurabilirsiniz.
command_output_length_sans_trailing_newlines () {
set -- "$("$@")"
echo "${#1}"
}
veya
command_output_length () {
set -- "$("$@"; echo .)"
echo "$((${#1} - 1))"
}
ancak genellikle faydası yoktur; ksh93 dışında, fonksiyonun çıktısını kullanabilmek için ekstra bir çatalın kullanılmasına neden olur, bu yüzden komut dosyanızı yavaşlatır ve nadiren okunabilirlik avantajı vardır.
Bir kez daha, readlink -f
kanonik yol artı bir yeni satır çıktısıdır ; kanonik yolun uzunluğunu istiyorsanız, 1 inç yerine 2 çıkarın command_output_length
. Kullanmak command_output_length_sans_trailing_newlines
doğru sonucu ancak kurallı yolun kendisi bir satırsonu ile bitmediğinde verir.
Baytlar ve Karakterler
${#…}
çok baytlı yerlerde fark yaratan, bayt cinsinden değil karakter cinsinden uzunluk olması gerekiyordu. Ksh93, bash ve zsh'nin makul güncel sürümleri LC_CTYPE
, ${#…}
yapının genişletildiği zamandaki değere göre karakterlerin uzunluğunu hesaplar . Diğer birçok yaygın kabuk gerçekten çokbaytlı yerel ayarları desteklemez: tire 0.5.7, mksh 46 ve posh 0.12.3'ten itibaren, ${#…}
uzunluğu bayt cinsinden döndürür. Karakterlerin uzunluğunu güvenilir bir şekilde istiyorsanız, wc
yardımcı programı kullanın :
$(readlink -f /etc/fstab | wc -m)
$LC_CTYPE
Geçerli bir yerel ayar belirttiği sürece , bunun hata vereceğinden (çok baytlı yerel ayarları desteklemeyen eski veya kısıtlı bir platformda) veya karakterlerde doğru uzunluğu döndüreceğinden emin olabilirsiniz. (Unicode için, “karakter cinsinden uzunluk”, kod noktası sayısı anlamına gelir - karakterleri birleştirme gibi komplikasyonlar nedeniyle glif sayısı başka bir hikaye.)
Uzunluğu bayt cinsinden istiyorsanız, LC_CTYPE=C
geçici olarak ayarlayın veya wc -c
yerine kullanın wc -m
.
İle bayt veya karakter sayma wc
, komuttaki sondaki yeni satırları içerir. Kanonik yolun uzunluğunu bayt cinsinden istiyorsanız,
$(($(readlink -f /etc/fstab | wc -c) - 1))
Karakterlerle elde etmek için 2 çıkarın.
readlink -f /etc/fstab
olan 11 karakter. Yeni satırı unutmayın. Aksi takdirde/etc/fstabluser@cern:~$
, onu bir kabuktan ne zaman çalıştırdığınızı görürsünüz .