Standardmäßig wird der Befehl nicht gefunden, wenn er nach der Deklaration der Variablen ausgeführt wird


1

Warum funktioniert der folgende Code nicht?

#!/bin/sh
PATH=$PWD/Info
defaults read $PATH

Jedes Mal, wenn ich es ausführe, bekomme ich

./script: Zeile 3: Standard: Befehl nicht gefunden

Sobald ich es in einer Zeile mache, funktioniert es

defaults read $PWD/Info

So ist es in Ordnung. Ich bin nur Neugierig.


Variablen unterscheiden zwischen Groß- und Kleinschreibung. Laut Konvention sind All-Caps-Variablen globale Variablen oder Umgebungsvariablen. Sie sollten für Ihre scriptlokalen Variablen Namen in Kleinbuchstaben verwenden. Es lohnt sich auch, mehr über die wichtigsten unter diesen Globalen wie PATH zu erfahren.
Mkaito

@mkaito: Der Hedge-Code enthält keine benutzerdefinierten Variablen. PATH und PWD müssen groß geschrieben werden, um ihre besondere Bedeutung zu erhalten.
Juli

Antworten:


5

Weil Sie sich ändern $PATH, was eine spezielle Variable ist. Die Shell verwendet PATH für die Suche nach ausführbaren Programmen. defaultsist wahrscheinlich einer von ihnen, aber nachdem der Ordner aus PATH entfernt wurde, kann die Shell ihn nicht mehr ausführen.


3

Zum Pfad hinzufügen, anstatt ihn zu ersetzen:

PATH=$PWD/Info:$PATH

Sollte sein: PATH="$PWD/Info:$PATH"oderPATH="$PATH:$PWD/Info"
jlliagre

1
@jlliagre: Die Anführungszeichen sind nicht erforderlich. Die Wortteilung wird nicht auf der rechten Seite einer Aufgabe ausgeführt. Sie brauchen nur Anführungszeichen, wenn Sie Sonderzeichen buchstäblich einschließen.
Dennis Williamson

1
In der Tat waren meine Punkte eher das Trennzeichen (Sie haben ein Semikolon anstelle eines Doppelpunkts verwendet, der jetzt durch Grawity festgelegt wurde) und die Reihenfolge der Pfadkomponenten. Sofern Befehle nicht speziell so konzipiert sind, dass sie Vorrang vor Standardbefehlen haben, bevorzuge ich aus offensichtlichen Sicherheitsgründen, dass die zusätzlichen Komponenten angehängt und nicht vorangestellt werden.
Juli
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.