Skript pro změnu aktuálního adresáře (cd, pwd)

Chci spustit skript, který jednoduše změní aktuální pracovní adresář:

#!/bin/bash cd web/www/project 

Ale po jeho spuštění zůstane aktuální pwd beze změny! Jak to mohu udělat?

Odpovědět

Je to očekávané chování. Skript je spuštěn v subshellu a nemůže změnit pracovní adresář nadřazeného prostředí. Jeho efekty se po dokončení ztratí.

Chcete-li trvale změnit adresář aktuálního shellu, měli byste použít příkaz source, alias také jednoduše jako ., který spouští skript v aktuálním prostředí prostředí namísto dílčího prostředí.

Následující příkazy jsou identické:

. script 

nebo

source script 

Komentáře

  • @Sony: Měli byste použít return uniknout z takto získaného skriptu, nikoli exit – jsou jako funkce prostředí a exit opustí prostředí, ze kterého byl získán skript.
  • @CharlesStewart Ve skutečnosti nejsem ‚ obeznámen se získanými skripty. Děkuji!
  • je source ./script stejný?
  • @amyassin: ano, je
  • 1. . a source jsou si rovny v bash. 2. don ‚ Pokud je soubor ‚ ve stejném adresáři, je třeba před název souboru použít ./. Je v pořádku spustit pouze toto: . script

Odpověď

U malých úkolů, jako je tento, místo vytváření skriptu vytvořte alias, jako je tento,

$ alias cdproj="cd /dir/web/www/proj" 

Toto byste měli přidat do svého .bashrc soubor, pokud ho chcete nastavit pro každý interaktivní shell.

Nyní jej můžete spustit jako $ cdproj.

Komentáře

  • Můžete také nechat skript ozvěnou příkazů, které mají být provedeny, a poté použít eval `./script` nebo eval $(./script) k provedení těchto příkazů. Toto je běžný přístup pro příkazy, které potřebují aktualizovat prostředí vyvolávajícího prostředí ‚ s.
  • Pokud se chystáte jít, buďte velmi opatrní ohledně toho, co vydáváte. přístup eval.

Odpověď

Použít exec bash na konci

Baskript funguje na svém aktuálním prostředí nebo na prostředí svých dětí, ale nikdy na svém rodičovské prostředí.

Tato otázka se však často ptá, protože člověk chce zůstat v bash výzva v určitém adresáři po provedení bash skriptu z jiného adresáře.

Pokud je to tak, jednoduše na konci proveďte podřízenou instanci bash skriptu:

#!/usr/bin/env bash cd desired/directory exec bash 

Tím se vytvoří nový subshell. Zadejte Ctrl + D nebo exit a vraťte se do prvního prostředí, kde byl skript původně spuštěn.

Aktualizovat

Alespoň u novějších verzí bash již exec na posledním řádku již není vyžadován. Skript lze dále nastavit tak, aby pracoval s libovolným preferovaným shellem pomocí proměnné prostředí $SHELL. To pak dává:

#!/usr/bin/env bash cd desired/directory $SHELL 

Komentáře

  • Lepší je pouze skript získat, jako v přijaté odpovědi : použití exec se obvykle považuje za poslední možnost darebáka .. 🙂
  • tento trik ‚ t pracujte v debian 9 stretch.
  • Tohle je špatný způsob, jak to udělat!
  • Protože s tím nikdo podrobně nespecifikoval problémy (dívám se na vás, @Dennis): (1) Pokaždé, když toto spustíte, vytvoří se nový, trvalý proces bash. Udělejte to deset nebo dvacetkrát v relaci a budete mít nashromážděných 11 až 21 procesů bash. To může ovlivnit výkon, a pokud se pokusíte relaci ukončit čistě zadáním exit (nebo Ctrl + D), budete to muset provést 11 až 21krát. (2) Další nevýhodou použití spustitelného skriptu je, že pokud ve svém souboru nastavíte libovolné možnosti prostředí (např. dotglob nebo globstar) interaktivní relace shellu, ztratíte je, protože spouštíte nový shell.
  • Velmi pěkné řešení! ‚ jsem přepsal svůj alias v bash_profile, takže nyní se jedná o skript uložený v samostatném souboru. Pomocí skriptu přejdu do nově vytvořené dočasné složky. A teď je ještě snazší mít dočasnou relaci bash. SRP v akci! Dík!

Odpověď

I když existují odpovědi, které dělají přesně požadovanou akci, je to standardnější metoda účelem je vytvořit symbolický odkaz:

ln -s ~/web/www/project proj #use full path to dir! 

Pak byste mohli cd do adresáře použít název proj:

cd proj 

Tato metoda je flexibilnější, protože k souborům můžete přistupovat pomocí krátkého názvu bez cd:

ls proj/ #note the endslash! vim proj/file.x 

odpověď

záleží na tom, co „chystáme se udělat, dalším řešením může být vytvoření funkce místo skriptu.

Příklad:

Vytvořte funkci v souboru, řekněme /home/aidin/my-cd-script:

function my-cd() { cd /to/my/path } 

Poté jej zahrňte do bashrc nebo zshrc soubor:

# Somewhere in rc file source /home/aidin/my-cd-script 

Nyní jej můžete použít jako příkaz:

$ my-cd 

Odpověď

Pokud v souborovém systému přepínáte mezi vzdálenými adresáři. Doporučím autojump .

Odpověď

Nejpohodlnějším a nejflexibilnějším přístupem pro mě byla kombinace aliasu a skriptu:

vytvořit skript s libovolnou logikou

Zde vytvořím skript, který se změní na adresář a aktivuje příslušné prostředí pythonu. Umístění skriptů je příkladné v /path/to/workon_myproj.sh.

#!/usr/bin/env bash cd $HOME/workspace/myproj source .venv/bin/activate 

vytvoření aliasů, které zdrojují skript

alias workon_myproj="source /path/to/workon_myproj.sh" 

Přidejte definici aliasu do příslušného startovacího souboru prostředí, např. .profile, .bashrc nebo .zshrc.

výsledek

Nyní můžete jednoduše spustit soubor workon_myproj v prostředí, které bude zdrojem obsahu vašeho skriptu v požadovaném adresáři.

rozšiřitelnost

Dalo by se vylepšit váš skript, aby převzal argument, aby fungoval s více projekty v konkrétním pracovním adresáři, nebo jej kombinovat s git pull, abyste okamžitě získali nejnovější změny a tak na … všechno, co děláte, když pracujete na konkrétním projektu.

Odpovědět

Proč nepoužívat “ exec „dělá to, co chci.

#!/bin/bash cd someplace exec bash ~/someplace 

Komentáře

  • Dejte si pozor na věci, které Zdá se , že je to, co chcete. (Obří dřevěný kůň! Přesně to jsem chtěl!) Pokaždé, když to spustíte, vytvoří se nový, trvalý bash proces. Udělejte to deset nebo dvacetkrát v relaci a budete mít naskládaných 11 až 21 procesů bash. To může ovlivnit výkon a pokud se pokusíte relaci ukončit čistě zadáním exit (nebo Ctrl + D), budete to muset provést 11 až 21krát.
  • Rozhodně jsem viděl, kde by to byl problém. Pro mě to ale ‚ používám jednou, dělám práci, kterou potřebuji, a poté ukončím. Pokud je to ‚ jedinou nevýhodou, s tím může žít. Na druhou stranu, pokud existuje lepší řešení, jsem ‚ ochoten se na něj podívat.
  • Odpověď Aidina na tuto otázku pomocí funkce shellu a odpověď Sachina Divekara pomocí aliasu jsou (IMO) lepším řešením než použití skriptu . P.S. Další nevýhodou použití skriptu je, že pokud nastavíte jakékoli možnosti prostředí (např. dotglob nebo globstar), ztratíte je, protože začínáte nový shell. … (Pokračování)
  • (pokračování)… P.P.S. Právě jsem si všiml, že v zásadě opakujete odpověď Serge Stroobandta a říkáte Proč to neudělat? Na Stack Exchange očekáváme, že odpovědi poskytnou nové nápady nebo informace, nejen diskutovat o dalších odpovědích.

Odpovědět

To kombinuje odpověď Serge s nesouvisející odpovědí Davida . Změní adresář a poté místo vynucení prostředí bash spustí výchozí prostředí uživatele . Vyžaduje však getent a /etc/passwd detekovat výchozí prostředí.

 #!/usr/bin/env bash cd desired/directory USER_SHELL=$(getent passwd <USER> | cut -d : -f 7) $USER_SHELL  

Samozřejmě to má stále stejný nedostatek při vytváření vnořeného shellu.

Odpověď

Můžete to udělat pomocí funkce nebo pomocí & & Níže uvedené příklady nainstalují Zabbix a vytvoří soubor s řádkem uvnitř.

Příklad:

#!/bin/bash # Create Function: installZabbix(){ cd /usr/src/zabbix-4.2.4; ./configure --enable-agent; make install; cd /usr/src/; >file; echo "Hi, this is a file." >>file; } # Call the function: installZabbix 

nebo:

#!/bin/bash cd /usr/src/zabbix-4.2.4 && ./configure --enable-agent && make install && cd /usr/src && >file && echo "Hi, this is a file." >>file 

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *