Yanıtlar:
Ç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
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 .
sholduğunu dashama kurtarma sisteminin kullandığı düşünülen /bin/shbusybox değil. Emin misiniz?
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.
[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
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).
[Yerleşik olmayan bir kabuk, sadece yazarlarını eklememeye karar veren bir kabuktur. örneğin bir yerleşiktcshyok[.