680 Stimmen

Unix-Shell-Skript herausfinden, in welchem Verzeichnis sich die Skriptdatei befindet?

Grundsätzlich muss ich das Skript mit Pfaden ausführen, die sich auf den Speicherort der Shell-Skriptdatei beziehen. Wie kann ich das aktuelle Verzeichnis in das gleiche Verzeichnis ändern, in dem sich die Skriptdatei befindet?

15 Stimmen

Ist das wirklich ein Duplikat? In dieser Frage geht es um ein "Unix-Shell-Skript", in der anderen speziell um Bash.

3 Stimmen

@BoltClock: Diese Frage wurde fälschlicherweise geschlossen. In der verlinkten Frage geht es um Bash. In dieser Frage geht es um Unix-Shell-Programmierung. Beachten Sie, dass die akzeptierten Antworten sehr unterschiedlich sind!

0 Stimmen

@Dietrich Epp: Sie haben Recht. Es scheint, dass die Wahl der akzeptierten Antwort durch den Fragesteller und die Hinzufügung des [bash]-Tags (wahrscheinlich als Reaktion darauf) mich dazu veranlasst hat, die Frage als Antwort auf eine Markierung als Duplikat zu kennzeichnen.

1voto

Zombo Punkte 1

Inspiriert durch blueyed's Antwort

read < <(readlink -f $0 | xargs dirname)
cd $REPLY

0voto

Leslie Krause Punkte 347

Mit tcsh können Sie die :h um den Pfad abzurufen.

Eine Einschränkung ist, dass, wenn das Skript als tcsh myscript.csh , dann erhalten Sie nur den Skriptnamen. Eine Abhilfe besteht darin, den Pfad wie unten gezeigt zu validieren.

#!/bin/tcsh

set SCRIPT_PATH = $0:h
if ( $SCRIPT_PATH == $0 ) then
        set SCRIPT_PATH = "."
endif

$SCRIPT_PATH/compile.csh > $SCRIPT_PATH/results.txt

Weitere Informationen über variable Modifikatoren finden Sie unter https://learnxinyminutes.com/docs/tcsh/

0voto

johansenj Punkte 61

Eine der zuverlässigsten Methoden, die ich gefunden habe, ist

#!/bin/sh
relative_dir=`perl -e 'use Cwd "realpath";$pwd = realpath(shift); $pwd =~ s/\/[^\/]*$//; print $pwd' $0`
cd $relative_dir

funktioniert mit Symlinks und hat bei vielen meiner Kollegen funktioniert, unabhängig von der Wahl des Shell-Typs

-4voto

Das sollte genügen:

echo `pwd`/`dirname $0`

Je nach Aufruf und cwd kann es hässlich aussehen, aber es sollte Sie ans Ziel bringen (oder Sie können die Zeichenkette ändern, wenn Ihnen das Aussehen wichtig ist).

1 Stimmen

Stackoverflow-Escape-Problem hier: es sollte sicherlich so aussehen: `pwd`/`dirname $0` kann aber dennoch bei Symlinks fehlschlagen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X