Bash betiğinden geçerli dizini değiştirme


190

Geçerli dizini bir komut dosyasından değiştirmek mümkün müdür?

Bash'te dizin navigasyonu için bir yardımcı program oluşturmak istiyorum. Aşağıdaki gibi görünen bir test komut dosyası oluşturdum:

#!/bin/bash
cd /home/artemb

Bash kabuğundan betiği yürüttüğümde geçerli dizin değişmiyor. Geçerli kabuk dizinini bir komut dosyasından değiştirmek mümkün müdür?


2
Sadece bir geliştirme önerisi: yerine (çıktısını bastırmak için pushdyönlendirilmiş olabilir >/dev/null) kullanırsanız cd, daha sonra ile önceki dizine dönebilirsiniz popd.
mklement0

Yanıtlar:


173

Komut dosyanızı bir kabuk işlevine dönüştürmeniz gerekir:

#!/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
}

Bunun nedeni, her işlemin kendi geçerli dizinine sahip olması ve bir programı kabuktan yürüttüğünüzde yeni bir işlemde çalıştırılmasıdır. Standart "cd", "pushd" ve "popd" kabuk yorumlayıcısında yerleşiktir, böylece kabuk işlemini etkilerler.

Programınızı bir kabuk işlevi haline getirerek, kendi işlem içi komutunuzu eklersiniz ve daha sonra herhangi bir dizin değişikliği kabuk işlemine yansıtılır.


2
bunu tcsh ile nasıl yapardın?
joedborg

4
+1. Fark ettiğim bir şey dosyadaydı, çağırmadan önce fonksiyonu tanımlamamız gerekiyor. Benim gibi tecrübesiz birine yardım edebilir.
Bhushan

Bir işlevi tanımlama ve takma ad oluşturma arasındaki büyük fark nedir?
HelloGoodbye

1
Bu myprog.sh dosyasını oluşturup .bashrc dosyasına ekledikten sonra komut dosyasını nasıl çalıştırabilirim? İşlevimi başka bir kabuk dosyasından mı yoksa doğrudan kabuktan mı çağırmalıyım? Her iki şekilde de işe yaramıyor gibi görünüyor ...
Andrea Silvestri

1
@AndreaSilvestri Oturumu kapatın ve tekrar oturum açın veya .bashrc kaynağını kullanın. .Bashrc dosyasına eklemek, .bashrc çalıştırılana kadar hiçbir şey yapmaz.
Jon Strayer

214

Komut dosyanızı başlattığınızda, yalnızca ortamınızı devralan yeni bir işlem oluşturulur. Bittiği zaman biter. Mevcut ortamınız olduğu gibi kalır.

Bunun yerine, komut dosyanızı şu şekilde başlatabilirsiniz:

. myscript.sh

.Değiştirilmemeli olabilir böylece, mevcut ortamda senaryoyu değerlendirecek


4
+1 çünkü haklısın. İçtenlikle her ihtiyaç duyduğunda bir dizin değiştirme komut dosyası kaynak isteyecektir. Ayrıca, .shuzantılar tamamen eww. Onları kullanma.
lhunath

1
Evet, genellikle bu şekilde kullanmamak daha iyidir. Çoğu zaman mevcut ortamınızın acı çekmediğine sevinirsiniz. Ama sonra doğru yere geçmek de dahil olmak üzere benim için bazı kurulum görevleri yapmak için komut dosyaları var ve sonra ben. onlar da. Btw. .sh elbette kişisel bir tarz meselesidir. Muhtemelen sistem genelinde komut dosyaları yüklerken kullanmazdım. Ama ~ / bin'imde ne olduğunu bilmek için kullanıyorum :)
Norbert Hartl

11
@lhunath .sh uzantıları neden tamamen yeni?
Carl Pritchett


1
Bana göre bu makaledeki mantık sahte. Sonuç açık bir şekilde biliniyor ama bunun nedenlerini bulmak o kadar kolay değildi. Demek istediğim şu ki bu kişisel bir tarz meselesi, başka bir şey değil.
Norbert Hartl

55

Cevapların okunamazlığı ve aşırı komplikasyonu ışığında, talep eden kişinin yapması gereken bu olduğuna inanıyorum

  1. bu komut dosyasını PATH
  2. betiği şu şekilde çalıştır . scriptname

.(Nokta) emin komut bir çocuğun kabuk çalıştırılan değil yapacaktır.


38

Yukarıdakileri bir araya getirerek, bir takma ad yapabilirsiniz

alias your_cmd=". your_cmd"

baştaki "." betiğinizi kabuk ortamına her kaynaklamak istediğinizde veya hatırlamak istemiyorsanız betiğin düzgün çalışması için bu işlemin yapılması gerekir.


Bu yeniden başlatmalarda kalıcı kalacak mı?
SDsolar

1
@SDsolar Kalıcı olması için bunu ~ / .bashrc dosyanıza eklemeniz gerekir. Benim için bir cazibe gibi çalışıyor.
Rafał G.

~ / .Bash_aliases
Champ

@ ~/.bash_aliasesBash başlatıldığında, her zaman şampiyon kaynağı olmaz.
Mateusz Piotrowski

31

Eğer bash kullanıyorsanız takma adı deneyebilirsiniz:

.bashrc dosyasına bu satırı ekleyin:

alias p='cd /home/serdar/my_new_folder/path/'

komut satırına "p" yazdığınızda, dizin değişir.


1
Takma ad için +1. kabuk işlevi ilginç ama OP cd ile basit bir nav istedi. Çoğu insanın kaynak kod dallarında gezinmek için böyle bir senaryoya ihtiyacı olduğunu tahmin ediyorum ve bu takma ad yeterli
Brad Dre

19

Bir bash betiği çalıştırırsanız, o zaman geçerli ortamında veya alt öğelerinde çalışır, asla ebeveyn üzerinde çalışmaz.

Hedef komutunuzu çalıştırmaksa: goto.sh / home / test Sonra / home / test içinde etkileşimli olarak çalışmanın bir yolu betiğinizde bir bash etkileşimli alt kabuk çalıştırmaktır:

#!/bin/bash
cd $1
exec bash

Bu şekilde, bu kabuktan çıkana kadar (çıkış veya Ctrl + C) / home / test içinde olursunuz.


Bu çalıştığım bir kabuk komut dosyası için sorunu düzeltmek düşündüm ama bunun yerine kabuk başlar ve ne istediğimi unutur.
vwvan

14

İle Pushd geçerli dizin dizin yığına ve verilen dizine değiştirilir, POPD yığının üstüne dizin almak ve ona sonra değişir.

pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null

2
Bu sorumu cevaplıyor - bu çözümü S3 init komut dosyasında aktif olarak dağıtmak ve mükemmel bir şekilde çalışıyor. Teşekkürler @seb.
19h

5

Sadece

yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor

ve bu kodu son satırın yanına ekleyin:

alias yourcommand="cd /the_path_you_wish"

Sonra editörden çıkın.

Sonra şunu yazın:

source ~/.bashrc or source ~/.bash_profile on MAC.

şimdi kullanabilirsiniz: terminalde yourcommand



3

Temelde cd..her dizinden geri dönmek için kullanırız . Bir seferde geri dönmeniz gereken dizin sayısını vererek bunu kolaylaştırmayı düşündüm. Diğer ad komutunu kullanarak ayrı bir komut dosyası kullanarak bunu uygulayabilirsiniz. Örneğin:

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'   

source code.shMevcut kabukta kullandıktan sonra şunları kullanabilirsiniz:

$back 2 

geçerli dizinden iki adım geri gelmek için. Burada ayrıntılı olarak açıklanmıştır . Ayrıca, açılan her yeni kabuğun otomatik olarak bu yeni takma ad komutuna sahip olması için kodun ~ / .bashrc içine nasıl konulacağı açıklanmaktadır. Daha fazla if conditionsve farklı argümanlar ekleyerek kodu değiştirerek belirli dizinlere gitmek için yeni komut ekleyebilirsiniz . Ayrıca üzerinde git den kodu çekebilirsiniz burada .


Güzel bir çözüm, bu yüzden bash profilinizi asla
bozmazsınız

0

Bu yaklaşım benim için daha kolay.

Yönetici olduğunuz kişisel bir iMac üzerinde, bir komut penceresi açıldığında varsayılan dizinin altında / Users / jdoe dizininin şu adrese gidileceğini varsayalım: /Users/jdoe/Desktop/Mongo/db.3.2.1 /çöp Kutusu.

İşte bu işi yapabilecek adımlar:

  1. vi mongobin, içine girdim: cd /Users/jdoe/Desktop/Mongo/db.3.2.1/binilk satır olarak.
  2. chmod 755 mongobin
  3. source mongobin
  4. pwd

İşte bu kadar!


0

Ayrıca daha kolay gezinme için kullanabileceğiniz keçi adı verilen bir yardımcı program da oluşturdum .

Kaynak kodunu GitHub'da görüntüleyebilirsiniz .

İtibariyle V2.3.1 kullanım bakış böyle görünüyor:

# 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

0

Yeni bir mermi ateşlemeden farklı projeler için aynı şeyi yapmayı seviyorum.

Senin durumunda:

cd /home/artemb

Script'i şu şekilde kaydedin:

echo cd /home/artemb

Sonra ile ateşleyin:

\`./the_script\`

Sonra aynı kabuğu kullanarak dizine alırsınız.



0

Yolunuzu bildirin:

PATH='/home/artemb'     
cd ${PATH}

0

Sadece PWDbetiğinize yazın ve dışa aktarın, değişiklik devam edecektir.

export PWD=/your/desired/directory
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.