Köşeli ayraç yürütülebilir amacı nedir


Yanıtlar:


33

Çoğu durumda, [bir kabuk yerleşik ve eşdeğerdir test. Bununla birlikte, testaynı zamanda, bağımsız bir çalıştırılabilir olarak da var: /bin/[siz gördüm. Bunu test edebilirsiniz type -a [(çalışan bir Arch Linux sisteminde bash):

$ type -a [
[ is a shell builtin
[ is /bin/[

Yani, sistemimde iki tane var [: kabuğum yerleşik ve çalıştırılabilir /bin. Yürütülebilir dosya şurada belgelenmiştir man test:

TEST(1)                          User Commands                         TEST(1)

NAME
       test - check file types and compare values

SYNOPSIS
       test EXPRESSION
       test

       [ EXPRESSION ]
       [ ]
       [ OPTION

DESCRIPTION
       Exit with the status determined by EXPRESSION.

[ ... ]

Eğer adam sayfasının alıntı görebileceğiniz gibi yukarıda alıntılanan, testve [eşdeğerdir. /bin/[Ve /bin/testkomutlar şunlardır POSIX tarafından belirlenen birçok kabukları da yerleşikleri olarak sağlayamaz olmasına rağmen bunları bulacaksınız olmasını sağlıyor. Varlıkları şu gibi yapıları sağlar:

[ "$var" -gt 10 ]  && echo yes

Onları çalıştıran kabuğun [yerleşik olmadığı durumlarda bile çalışacaktır . Örneğin, içinde tcsh:

> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ]  && echo yes
yes

5
@AlexandruIrimiea ne demek istiyorsun? [Yerleşik olmayan bir kabuk, sadece yazarlarını eklememeye karar veren bir kabuktur. örneğin bir yerleşik tcsh yok[ .
terdon

7
@AlexandruIrimiea onlar "özel" kabukları değildir. Sadece bu bash, benzer işleri yapmak için tasarlanmış birçok programdan (kabuk) yalnızca biridir. Bash en popülerlerden biridir ancak pek çok sistem farklı varsayılan kabuklara sahiptir. İyi bilinen olanlardan bazıları sh, bash, zsh, dash, ksh, tcsh, cshve fish. Sisteminizde mevcut olanları cat /etc/shellsve kısmi bir listesini burada görebilirsiniz .
terdon

1
@ JörgWMittag gerçekten mi? Ben Ubuntu en biliyordum sholduğunu dashama kurtarma sisteminin kullandığı düşünülen /bin/shbusybox değil. Emin misiniz?
terdon

2
Bununla birlikte, bu sorudan
Sergiy Kolodyazhnyy,

1
@AlexandruIrimiea, hangi komutların oluşturulmasının gerekli olduğu ve hangi komutların inşa edilip edilemeyeceği ile ilgili olarak, bu yazıya bakınız .
Joker,

12

Kabuk betiklerinde durum testi için kullanılır. Bu programın başka bir adı test:

if [ 1 -lt 2 ]; then ...

Bu kabuk gramerine benziyor ama değil. Genellikle [bir kabuk yerleşiktir ancak muhtemelen geri dönüş olarak harici bir komut olarak bulunur.

İçindeki "KOŞULLU ANLATIMLAR" bloğuna bakın man bash.



9

[aynı komuttur test. Bazı * nix sistemlerinde, biri diğerine sadece bir bağdır. Örneğin, eğer çalıştırırsanız:

strings /usr/bin/test 
strings /usr/bin/[

aynı çıktıyı göreceksiniz.

Çoğu kabukları / posik kabukları yerleşik [ve testkomutları içerir. Aynı şey için de geçerlidir echo. /bin/echoMermilerin çoğunda hem bir komut hem de bir yerleşik vardır. Örneğin, bazen echofarklı sistemlerde aynı şekilde çalışmadığını hissetmenizin nedeni budur .

testveya [sadece bir çıkış kodunu döndürür 0veya 1. Test başarılı olursa, çıkış kodu 0'dır.

# you can use [ command but last argument must be ] 
# = inside joke for programmers 
# or use test command. Args are same, but last arg can't be ] :)
# so you can't write 
#    [-f file.txt] because [-f is not command and last argument is not ]
# after [ have to be delimiter as after every commands
[ -f file.txt ] && echo "file exists" || echo "file does not exist"
test -f file.txt && echo "file exists" || echo "file does not exist"
[ 1 -gt 2 ] && echo yes || echo no
test 1 -gt 2  && echo yes || echo no
# use external command, not builtin
/usr/bin/[ 1 -gt 2 ] && echo yes || echo no

Ayrıca kullanabilirsiniz [ile if:

if [ -f file.txt ] ; then
  echo "file exists" 
else 
  echo "file does not exist"
fi
# is the same as
if test -f file.txt  ; then
  echo "file exists" 
else 
  echo "file does not exist"
fi

Ancak ifher komutla kullanabilirsiniz , ifçıkış kodunu test etmek içindir. Örneğin:

cp x y 2>/dev/null && echo cp x y OK ||  echo cp x y not OK

Veya, kullanarak if:

if cp x y 2>/dev/null ; then
   echo cp x y OK
else
   echo cp x y not OK
fi

Aynı sonucu yalnızca testdeğişkene kaydedilen çıkış kodunu test etmek için komutu kullanarak elde edebilirsiniz stat:

cp x y 2>/dev/null 
stat=$?
if test "$stat" = 0 ; then
   echo cp x y OK
else
   echo cp x y not OK
fi

Ayrıca [[ ]]ve (( ))test etmek için de kullanabilirsiniz , ancak bunlar neredeyse aynı sözdizimine rağmen aynı [ve aynı değildir test:

Son olarak, bir komutun ne olduğunu bulmak için şunları kullanabilirsiniz:

type -a command

Dosyaları karşılaştırarak için, daha doğrusu kullanmalısınız cmp /usr/bin/[ /usr/bin/testbelki sağlamalarının veya sha256sum /usr/bin/[ /usr/bin/testdeğil strings. Sistemimde (openSUSE Tumbleweed) BTW aynı değil (nedense).
Hauke,

Karşılaştırma bayt demek istemedim. Bazı * nixlerde ayrıca byte düzeyinde de aynıdır = bağlı. Posix testi
kshji
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.