[gelöst] /user/bin - '[' file gelöscht ...

Du kommst mit der Installation nicht voran oder willst noch was nachfragen? Schau auch in den "Tipps und Tricks"-Bereich.
Antworten
Benutzeravatar
fulltilt
Beiträge: 1163
Registriert: 03.12.2006 20:10:57

[gelöst] /user/bin - '[' file gelöscht ...

Beitrag von fulltilt » 17.11.2024 15:01:55

Debian 12

habe vorhin versehentlich unter /user/bin die Datei '[' gelöscht ...
welchen Zweck erfüllt dieses bin file? stellt das ein Problem dar und falls ja, kann ich diese zur Wiederherstellung (falls nötig) einfach von einem anderen Debian12 System kopieren (scp)?
Zuletzt geändert von fulltilt am 17.11.2024 16:12:34, insgesamt 1-mal geändert.

Benutzeravatar
Livingston
Beiträge: 1813
Registriert: 04.02.2007 22:52:25
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: 127.0.0.1

Re: /user/bin - '[' file gelöscht ...

Beitrag von Livingston » 17.11.2024 15:15:06

Das brauchst Du ziemlich sicher. Es kommt in fast jedem Bash-Script vor:

Code: Alles auswählen

if [ $a = $b ] ...
was eine andere Schreibweise für den Befehl test ist:

Code: Alles auswählen

if test $a = $b ...
Das verlorengegangene [ stammt wahrscheinlich aus dem Paket Ich hoffe, ein

Code: Alles auswählen

apt-get --reinstall install bash
funktioniert noch.
Der Hauptunterschied zwischen etwas, was möglicherweise kaputtgehen könnte und etwas, was unmöglich kaputtgehen kann, besteht darin, dass sich bei allem, was unmöglich kaputtgehen kann, falls es doch kaputtgeht, normalerweise herausstellt, dass es unmöglich zerlegt oder repariert werden kann.
Douglas Adams

Benutzeravatar
smutbert
Beiträge: 8342
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: /user/bin - '[' file gelöscht ...

Beitrag von smutbert » 17.11.2024 15:17:53

Nein, in der Bash ist der Befehl eingebaut:

Das ist eine kurze Variante des Befehls test. In vielen Shells ist der Befehl eingebaut und für die Shells, in denen er nicht eingebaut ist, existiert er eben als eigenes Programm und ist Teil des Pakets Debiancoreutils

Code: Alles auswählen

$ dpkg -S  /usr/bin/\[
coreutils: /usr/bin/[
Solange alles mit rechten Dingen zugeht kann er bedenkenlos von einen anderen Debian 12 System derselben Architektur kopiert werden oder du kannst einfach das Paket erneut installieren

Code: Alles auswählen

# apt --reinstall install coreutils
(wobei ich mir wie Livingston auch nicht sicher bin, dass es ohne [ und weitere Maßnahmen noch funktioniert)

tobo
Beiträge: 2335
Registriert: 10.12.2008 10:51:41

Re: /user/bin - '[' file gelöscht ...

Beitrag von tobo » 17.11.2024 15:19:12

Du kannst die coreutils neu installieren:

Code: Alles auswählen

# apt-get --reinstall install coreutils
herauszufinden über:

Code: Alles auswählen

$ apt-file search /usr/bin/[
coreutils: /usr/bin/[                     
$
Aber benutzen wirst du (shellabhängig) vermutlich eh ein Shell-Builtin:

Code: Alles auswählen

$ type [
[ is a shell builtin
$
Edit:
Die Unterschiede von [ zu test (beim Programm /usr/bin/{[,test}) lassen sich in der manpage nachlesen. Das sind 2 unabhängige Programme und die funktionieren unabhängig voneinander.

Benutzeravatar
fulltilt
Beiträge: 1163
Registriert: 03.12.2006 20:10:57

Re: /user/bin - '[' file gelöscht ...

Beitrag von fulltilt » 17.11.2024 16:12:17

tobo hat geschrieben: ↑ zum Beitrag ↑
17.11.2024 15:19:12
Du kannst die coreutils neu installieren:

Code: Alles auswählen

# apt-get --reinstall install coreutils
Sehr cool, mit dem reinstall hat funktioniert, ich war mir nicht so sicher mit dem kopieren via scp :THX:
Ich werde die Kiste aber zur Sicherheit noch neu starten, da laufen ein paar bash scripts als cron job ...
Ich Danke euch!
V.G.
Zuletzt geändert von fulltilt am 17.11.2024 16:19:18, insgesamt 2-mal geändert.

Benutzeravatar
Meillo
Moderator
Beiträge: 9224
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: /user/bin - '[' file gelöscht ...

Beitrag von Meillo » 17.11.2024 16:13:23

tobo hat geschrieben: ↑ zum Beitrag ↑
17.11.2024 15:19:12
Edit:
Die Unterschiede von [ zu test (beim Programm /usr/bin/{[,test}) lassen sich in der manpage nachlesen. Das sind 2 unabhängige Programme und die funktionieren unabhängig voneinander.
Welche Unterschiede haben sie denn?

Meines Wissens unterscheidet sich nur die Aufrufsyntax in der Form, dass bei `[' das letzte Argument `]' sein muss, sonst sind sie vollkommen identisch.

POSIX schreibt dazu:
https://pubs.opengroup.org/onlinepubs/9699919799/utilities/test.html hat geschrieben: In the second form of the utility, where the utility name used is [ rather than test, the application shall ensure that the closing square bracket is a separate argument. The test and [ utilities may be implemented as a single linked utility which examines the basename of the zeroth command line argument to determine whether to behave as the test or [ variant.
Bei Debian (eine aeltere Version) sind es tatsaechlich zwei verschiedene Programme:

Code: Alles auswählen

:-Q cd /usr/bin/

:-Q ll \[ test
-rwxr-xr-x 1 root root 35248 2013-01-26 22:07 [*
-rwxr-xr-x 1 root root 31152 2013-01-26 22:07 test*
Auf FreeBSD ist es nur eines:

Code: Alles auswählen

:-/ cd /bin/    

:-/ ll \[ test
-r-xr-xr-x  2 root  wheel  12520 2024-06-12 14:17 [*
-r-xr-xr-x  2 root  wheel  12520 2024-06-12 14:17 test*
Die Frage ist, *warum* `test' und `[' in den Coreutils zwei separate, sich unterscheidende Binaries sind.

Die GNU Infopage schreibt:
hat geschrieben: Since ‘test expr’ and ‘[ expr ]’ have the same meaning, only the former form is discussed below.
Es gibt also eigentlich keinen Grund dazu.


Die Antwort auf die Frage nach den Unterschieden findet sich mit einem Blick in den Code:

Code: Alles auswählen

#ifndef LBRACKET
# define LBRACKET 0
#endif

...

  if (LBRACKET)
    {
      /* Recognize --help or --version, but only when invoked in the
         "[" form, when the last argument is not "]".  Use direct
         parsing, rather than parse_long_options, to avoid accepting
         abbreviations.  POSIX allows "[ --help" and "[ --version" to
         have the usual GNU behavior, but it requires "test --help"
         and "test --version" to exit silently with status 0.  */
      ...
https://git.savannah.gnu.org/cgit/coreu ... est.c#n834

Das ist der einzige Unterschied, den ich im Code habe finden koennen. Drei Bedingungen fuer Sonderbehandlungen der Argumente ... da haette man die Conditional Compilation auch durch eine Pruefung auf `argv[0]' ersetzen koennen, damit alles ein Programm bleibt. ... Aber ich bin ja gemeinhin, was den Code angeht, anderer Meinung als GNU, insofern ueberrascht das hier nicht.

Btw: Hier das `['-Programm:

Code: Alles auswählen

#define LBRACKET 1
#include "test.c"
https://git.savannah.gnu.org/cgit/coreu ... lbracket.c


Und als Bonus noch dieses Schmankerl aus dem hochautomatisierten Makefile (local.mk):

Code: Alles auswählen

# This is for the '[' program.  Automake transliterates '[' and '/' to '_'.
src___SOURCES = src/lbracket.c
https://git.savannah.gnu.org/cgit/coreu ... al.mk#n370
(Hinweis: Aus `src/[' wird `src__'. :-D )
Use ed once in a while!

tobo
Beiträge: 2335
Registriert: 10.12.2008 10:51:41

Re: /user/bin - '[' file gelöscht ...

Beitrag von tobo » 17.11.2024 16:38:13

Meillo hat geschrieben: ↑ zum Beitrag ↑
17.11.2024 16:13:23
tobo hat geschrieben: ↑ zum Beitrag ↑
17.11.2024 15:19:12
Edit:
Die Unterschiede von [ zu test (beim Programm /usr/bin/{[,test}) lassen sich in der manpage nachlesen. Das sind 2 unabhängige Programme und die funktionieren unabhängig voneinander.
Welche Unterschiede haben sie denn?
man test (bookworm) hat geschrieben: NOTE: [ honors the --help and --version options, but test does not. test treats each of those as it treats any other nonempty STRING.
Z.B.:

Code: Alles auswählen

$ /usr/bin/test --version                                                                                                                                               
$ /usr/bin/[ --version                                                                                                                                                  
[ (GNU coreutils) 9.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Kevin Braunsdorf and Matthew Bradburn.
$

Code: Alles auswählen

$ ls -l /usr/bin/{[,test}
-rwxr-xr-x 1 root root 68496 2022-09-20 17:27 '/usr/bin/['
-rwxr-xr-x 1 root root 60304 2022-09-20 17:27  /usr/bin/test
$

Benutzeravatar
Meillo
Moderator
Beiträge: 9224
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: /user/bin - '[' file gelöscht ...

Beitrag von Meillo » 17.11.2024 16:47:17

tobo hat geschrieben: ↑ zum Beitrag ↑
17.11.2024 16:38:13
Meillo hat geschrieben: ↑ zum Beitrag ↑
17.11.2024 16:13:23
Welche Unterschiede haben sie denn?
man test (bookworm) hat geschrieben: NOTE: [ honors the --help and --version options, but test does not. test treats each of those as it treats any other nonempty STRING.
Z.B.:

Code: Alles auswählen

$ /usr/bin/test --version                                                                                                                                               
$ /usr/bin/[ --version                                                                                                                                                  
[ (GNU coreutils) 9.1
Copyright (C) 2022 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Kevin Braunsdorf and Matthew Bradburn.
$
Lustigerweise waere gerade das das beste Argument *gegen* eine Conditional Compilation. :-D

Im derzeitigen Zustand mit zwei separaten Binaries ist es unmoeglich den Version-String von test(1) abzufragen. Man kann ihn nur von [(1) abfragen, der sich aber von dem von test(1) unterscheiden kann, da es zwei verschiedene Binaries sind.

Waere es nur ein Binary, das anhand von `argv[0]' eine andere Aufrufsyntax hat, dann koennte man die Version von test(1) ganz einfach dadurch rausfinden, dass man es als [(1) aufruft.

Die Conditional Compilation gewinnt nichts ... vermutlich nicht mal ein winziges Bisschen schnellere Ausfuehrung (die vermutlich der Grund fuer die Conditional Compilation war), da die Wahrscheinlichkeit, dass die Version von test/[, die man gerade aufruft schon gecacht ist, geringer ist als wenn es nur genau eine Version gibt.

Ein Umbau von Conditional Compilation zu einer Fallunterscheidung zur Laufzeit wuerde nur ein weiteres if mit strcmp(3) erfordern und dass `LBRACKET' kein Define sondern eine Variable ist.
Use ed once in a while!

Antworten