Ändern Sie das aktuelle Verzeichnis aus einem Bash-Skript
-
22-08-2019 - |
Frage
Ist es möglich, aktuelles Verzeichnis aus einem Skript zu ändern?
Ich möchte ein Dienstprogramm für die Verzeichnisnavigation in Bash erstellen. Ich habe ein Testskript erstellt, die wie folgt aussieht:
#!/bin/bash
cd /home/artemb
Als ich das Skript aus dem Bash ausführen Shell das aktuelle Verzeichnis nicht ändert. Ist es überhaupt möglich, das aktuelle Shell-Verzeichnis von einem Skript zu ändern?
Lösung
Sie benötigen Skript in eine Shell-Funktion konvertieren:
#!/bin/bash
#
# this script should not be run directly,
# instead you need to source it from your .bashrc,
# by adding this line:
# . ~/bin/myprog.sh
#
function myprog() {
A=$1
B=$2
echo "aaa ${A} bbb ${B} ccc"
cd /proc
}
Der Grund dafür ist, dass jeder Prozess sein eigenes aktuelles Verzeichnis hat, und wenn Sie ein Programm aus der Shell ausführen wird in einem neuen Prozess laufen. Der Standard "cd", "pushd" und "popd" ist mit dem Shell-Interpreter gebautet, so dass sie den Shell-Prozess beeinflussen.
Mit Ihrem Programm einer Shell-Funktion zu machen, den Sie hinzufügen Ihren eigenen in-Prozess-Befehl und dann wird jede Verzeichnisänderung in dem Shell-Prozess wider.
Andere Tipps
Wenn Sie Ihren Skript starten, ein neues Verfahren geschaffen, dass nur Ihre Umgebung erbt. Wenn es endet, endet es. Ihre aktuelle Umgebung bleibt, wie es ist.
Stattdessen können Sie Ihr Skript wie folgt beginnen:
. myscript.sh
Die .
wird das Skript in der aktuellen Umgebung bewerten, so dass es möglicherweise geändert werden
Im Lichte der Unlesbarkeit und overcomplication der Antworten, ich glaube, das ist das, was der Anforderer tun sollte
- fügen Sie das Skript zum
PATH
- das Skript als
. scriptname
Die .
(dot) werden sicherstellen, dass das Skript nicht in einem Kind Shell ausgeführt wird.
Setzen Sie die oben zusammen, können Sie einen Aliasnamen machen
alias your_cmd=". your_cmd"
Wenn Sie nicht wollen, die führende schreiben „“ jedes Mal Sie möchten Ihr Skript an die Shell-Umgebung beziehen, oder wenn Sie wollen einfach nicht, dass sich daran zu erinnern muss getan werden, für das Skript korrekt funktioniert.
Wenn Sie bash verwenden Sie können alias versuchen:
in die Datei .bashrc diese Zeile hinzufügen:
alias p='cd /home/serdar/my_new_folder/path/'
Wenn Sie „p“ auf der Kommandozeile zu schreiben, wird es das Verzeichnis ändern.
Wenn Sie einen Bash-Skript ausführen, dann wird es arbeitet auf seiner aktuellen Umgebung oder die ihre Kinder, nie auf dem Elternteil.
Wenn Ziel ist Ihr Befehl ausgeführt werden soll: goto.sh / home / test Dann arbeitet interaktiv in / home / test ein Weg ist, ein Bash interaktives Subshell in Ihrem Skript auszuführen:
#!/bin/bash
cd $1
exec bash
Auf diese Weise werden Sie in / home / Test bis zur Ausfahrt (Ausfahrt oder Strg + C) dieser Schale sein.
Mit pushd das aktuelle Verzeichnis auf dem Verzeichnisstapel geschoben wird, und es wird in das angegebene Verzeichnis geändert, popd das Verzeichnis oben auf dem Stapel und Änderungen erhalten dann es.
pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null
Einfach gehen Sie zu
yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor
und fügen Sie diesen Code neben der letzten Zeile:
alias yourcommand="cd /the_path_you_wish"
Dann Editor beenden.
Geben Sie dann:
source ~/.bashrc or source ~/.bash_profile on MAC.
Jetzt können Sie: yourcommand in Terminal
Ich habe ein Skript gemacht Verzeichnis zu wechseln. werfen Sie einen Blick: https://github.com/ygpark/dj
Im Grunde verwenden wir cd..
aus jedem Verzeichnis zu kommen. Ich dachte es, indem die Anzahl der Verzeichnisse leichter zu machen, mit dem Sie müssen zu einem Zeitpunkt zurück zu kommen. Sie können dies mit einer separaten Skript-Datei implementieren, um den Alias-Befehl. Zum Beispiel:
code.sh
#!/bin/sh
_backfunc(){
if [ "$1" -eq 1 ]; then
cd ..
elif [ "$1" -eq 2 ]; then
cd ../..
elif [ "$1" -eq 3 ]; then
cd ../../..
elif [ "$1" -eq 4 ]; then
cd ../../../..
elif ["$1" -eq 10]; then
cd /home/arun/Documents/work
fi
}
alias back='_backfunc'
Nach source code.sh
in der aktuellen Shell verwenden, können Sie verwenden:
$back 2
kommt zwei Schritte zurück aus dem aktuellen Verzeichnis. Erklärt im Detail über hier . Es wird auch dort erklärt, wie Sie den Code setzen in ~ / .bashrc, so dass jede neue Shell automatisch geöffnet wird diesen neuen Alias-Befehl hat. Sie können neuen Befehl hinzufügen, indem Sie den Code auf bestimmte Verzeichnisse zu gehen um mehr if conditions
und verschiedene Argumente hinzufügen. Sie können auch den Code aus git über rel="nofollow">.
Dieser Ansatz ist einfacher für mich.
auf einem persönlichen iMac Angenommen, wo Sie ein Admin sind, unter dem Standardverzeichnis, wenn ein Befehlsfenster geöffnet ist, / Users / jdoe, das ist das Verzeichnis zu gehen sein wird: / Users / jdoe / Desktop / Mongo / db. 3.2.1 / ist.
Dies sind die Schritte, die den Job haben kann getan:
- vi mongobin, in denen ich eintreten:
cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin
als die erste Zeile. -
chmod 755 mongobin
-
source mongobin
-
pwd
Voila!
Ich habe erstellt auch ein Programm namens Ziege , die Sie für eine einfachere Navigation verwenden können.
Sie können den Quellcode auf GitHub .
Wie von v2.3.1 die Verbrauchsübersicht wie folgt aussieht:
# Create a link (h4xdir) to a directory:
goat h4xdir ~/Documents/dev
# Follow a link to change a directory:
cd h4xdir
# Follow a link (and don't stop there!):
cd h4xdir/awesome-project
# Go up the filesystem tree with '...' (same as `cd ../../`):
cd ...
# List all your links:
goat list
# Delete a link (or more):
goat delete h4xdir lojban
# Delete all the links which point to directories with the given prefix:
goat deleteprefix $HOME/Documents
# Delete all saved links:
goat nuke
# Delete broken links:
goat fix
Ich mag die gleiche Sache für verschiedene Projekte tun, ohne einen neu Shell Anheizen.
In Ihrem Fall:
cd /home/artemb
Speichern the_script wie:
echo cd /home/artemb
es dann feuern mit:
\`./the_script\`
Dann erhalten Sie in das Verzeichnis, den gleich Shell verwenden.
Fügen Sie unter cd Zeile in der Shell folgt aus:
exec $SHELL
Erklären Sie Ihren Weg:
PATH='/home/artemb'
cd ${PATH}