Yanıtlar:
Çoğu durumda, [
bir kabuk yerleşik ve eşdeğerdir test
. Bununla birlikte, test
aynı 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, test
ve [
eşdeğerdir. /bin/[
Ve /bin/test
komutlar ş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
, csh
ve fish
. Sisteminizde mevcut olanları cat /etc/shells
ve kısmi bir listesini burada görebilirsiniz .
sh
olduğunu dash
ama kurtarma sisteminin kullandığı düşünülen /bin/sh
busybox 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 test
komutları içerir. Aynı şey için de geçerlidir echo
. /bin/echo
Mermilerin çoğunda hem bir komut hem de bir yerleşik vardır. Örneğin, bazen echo
farklı sistemlerde aynı şekilde çalışmadığını hissetmenizin nedeni budur .
test
veya [
sadece bir çıkış kodunu döndürür 0
veya 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 if
her 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 test
değ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/test
belki sağlamalarının veya sha256sum /usr/bin/[ /usr/bin/test
değ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şiktcsh
yok[
.