In den meisten Fällen [
ist eine Shell eingebaut und entspricht test
. Wie auch immer test
, es gibt es auch als eigenständige ausführbare Datei: das ist die, die /bin/[
Sie gesehen haben. Sie können dies testen mit type -a [
(auf einem Arch Linux-System, das ausgeführt wird bash
):
$ type -a [
[ is a shell builtin
[ is /bin/[
Also habe ich auf meinem System zwei [
: die eingebaute Shell und die ausführbare Datei /bin
. Die ausführbare Datei ist dokumentiert in 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.
[ ... ]
Wie Sie im Auszug der oben zitierten Manpage sehen können test
und [
gleichwertig sind. Die Befehle /bin/[
und /bin/test
werden von POSIX angegeben, weshalb Sie sie finden, obwohl viele Shells sie auch als integrierte Befehle bereitstellen. Ihre Anwesenheit stellt sicher, dass Konstrukte wie:
[ "$var" -gt 10 ] && echo yes
funktioniert auch dann, wenn die Shell, auf der sie ausgeführt werden, kein [
eingebautes Programm hat. Zum Beispiel in tcsh
:
> which [
/sbin/[
> set var = 11
> [ "$var" -gt 10 ] && echo yes
yes
[
eingebauten Code ist nur eine Shell, deren Autoren beschlossen haben, keine Shell hinzuzufügen.tcsh
nicht über eine[
eingebaute zum Beispiel.bash
ist nur eines von vielen Programmen (Shells), die für ähnliche Aufgaben entwickelt wurden. Bash ist eines der beliebtesten, aber viele Systeme werden mit unterschiedlichen Standard-Shells ausgeliefert. Einige der besser bekannten sindsh
,bash
,zsh
,dash
,ksh
,tcsh
,csh
undfish
. Sie können die auf Ihrem System verfügbaren mitcat /etc/shells
und eine Teilliste hier sehen .sh
ist,dash
aber ich dachte, das Rettungssystem verwendet/bin/sh
keine Busybox. Bist du sicher?Dies wird zum Testen von Bedingungen in Shell-Skripten verwendet. Ein anderer Name dieses Programms ist
test
:Das sieht aus wie Shell-Grammatik, ist es aber nicht. Normalerweise
[
ist eine Shell eingebaut, aber wahrscheinlich als Fallback existiert sie als externer Befehl.Siehe den Block "Bedingte Ausdrücke" in
man bash
.quelle
[
ist der gleiche Befehl wietest
. Auf einigen * nix-Systemen ist eines nur eine Verknüpfung zum anderen. Wenn Sie beispielsweise Folgendes ausführen:Sie sehen die gleiche Ausgabe.
Die meisten Shells / Posix-Shells enthalten Builtin
[
undtest
Befehle. Gleiches gilt fürecho
./bin/echo
In den meisten Shells gibt es sowohl einen Befehl als auch einen eingebauten Befehl. Das ist der Grund, warum Sie manchmal das Gefühl haben, dass zum Beispielecho
auf verschiedenen Systemen nicht dasselbe funktioniert.test
oder[
nur einen Exit-Code von0
oder zurückgeben1
. Wenn der Test erfolgreich war, lautet der Beendigungscode 0.Sie können auch
[
mitif
:Aber Sie können
if
mit jedem Befehlif
Exit-Code testen. Beispielsweise:Oder mit
if
:Sie können dasselbe Ergebnis nur mit dem
test
Befehl zum Testen des Exit-Codes erhalten, der in der Variablen gespeichert iststat
:Sie können auch
[[ ]]
und(( ))
zum Testen verwenden, aber diese sind nicht dieselben wie[
undtest
, obwohl sie fast dieselbe Syntax haben:Um herauszufinden, was ein Befehl ist, können Sie Folgendes verwenden:
quelle
cmp /usr/bin/[ /usr/bin/test
Hashes verwenden oder vielleichtsha256sum /usr/bin/[ /usr/bin/test
aber nichtstrings
. Auf meinem System (openSUSE Tumbleweed) sind sie übrigens nicht gleich (warum auch immer).