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?

War es hilfreich?

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

  1. fügen Sie das Skript zum PATH
  2. 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:

  1. vi mongobin, in denen ich eintreten: cd /Users/jdoe/Desktop/Mongo/db.3.2.1/bin als die erste Zeile.
  2. chmod 755 mongobin
  3. source mongobin
  4. 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}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top