2016-08-01 16 views
0

Ich mache ein paar benutzerdefinierte Befehle auf meinem Debian-Server und setze sie in den Ordner/usr/bin.Wie bekomme ich das Verzeichnis von wo ich das Skript aufrufen, wenn das Skript selbst in einem anderen Verzeichnis ist?

Ein benutzerdefinierter Befehl, den ich machen möchte, beinhaltet das Abrufen des Verzeichnisses von wo ich das Skript aufrufen, NICHT das Verzeichnis, in dem sich das Skript befindet.

Fast alle der Fragen, die ich hier finden beinhalten das Arbeitsverzeichnis

a=$PWD 

oder

a=$(pwd) 

Dies liefert nur das Verzeichnis, in dem das Skript befindet sich mit bekommen.

Edit: Ich bin mir bewusst,

$OLDPWD 

oben Der nur einen Teil der Zeit arbeiten.

Ist es möglich zu tun, was ich will?

Aktuelle Form mein Skript:

#!/bin/bash 
if [ -z "$1" ] 
then 
    a=$(pwd) 
    echo "Unlocking current directory." 
    sudo chmod 777 -R $a 
else 
    echo "Unlocking directory at \"$1\"" 
    sudo chmod 777 -R $1 
fi 
+0

Möchten Sie wissen, in welchem ​​Verzeichnis Ihr Skript gespeichert ist oder von welchem ​​Verzeichnis Ihr Skript aufgerufen wird? – Cyrus

+0

@Cyrus: Von welchem ​​Verzeichnis wird mein Skript aufgerufen. – zachboy82

Antwort

1

Eine benutzerdefinierte Befehl I beinhaltet machen möchten Sie das Verzeichnis aus bekommen, wo ich das Skript aufrufen,

Versuchen Sie, diese

#!/bin/bash 
pwd 

Im Gegensatz zu dem, was Sie erwähnt haben pwd sollten Sie den Platz geben, von wo aus das Skript

Probelauf

[email protected]:~/Documents/so$ ./myscript.sh 
/home/me/Documents/so 
[email protected]:~/Documents/so$ cd .. 
[email protected]:~/Documents$ ./so/myscript.sh 
/home/me/Documents 

Im Gegenteil genannt wird, wenn Sie wissen möchten, wo Sie Skript aus Sie Skript existiert - egal von wo aus es heißt - do

#!/bin/bash 
readlink -m "$(which $0)" #method1 
readlink -m "${BASH_SOURCE}" #method2 , preferred for reasons mentioned by @CharlesDuffy's comments 
+0

Ich habe es gerade jetzt versucht und wie Sie gesagt haben, es funktioniert wie ich will. Daher ist mein nächster Schritt herauszufinden, warum es in meinem "Befehlsskript" nicht funktioniert. – zachboy82

+0

@ zachboy82: Bitte aktualisieren Sie die Frage mit Ihrem vollständigen Skript. – sjsam

+1

'which' ist viel weniger genau als' $ BASH_SOURCE' - es sagt Ihnen, was zuerst im PATH steht, aber das ist nicht unbedingt das, was tatsächlich * aufgerufen wurde *. ('what' weiß nichts über Aliase, Shell-Funktionen, Cache-Lookups, etc; eine Verwendung davon ist nicht besser durch einen' type'-Aufruf zu ersetzen ist selten, und in diesem speziellen Anwendungsfall ist 'BASH_SOURCE' noch passender als "Typ"). –

Verwandte Themen