Komentosarja nykyisen hakemiston muuttamiseksi (cd, pwd)

Haluan suorittaa komentosarjan yksinkertaisesti vaihtaaksesi nykyisen työhakemiston:

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

Mutta kun olen suorittanut sen, nykyinen pwd pysyy muuttumattomana! Kuinka voin tehdä sen?

Vastaa

Se on odotettua käyttäytymistä. Komentosarja suoritetaan alikuoressa, eikä se voi muuttaa pääkuoren työhakemistoa. Sen vaikutukset menetetään, kun se on valmis.

Jos haluat muuttaa nykyisen shell-hakemiston pysyvästi, käytä komentoa source, joka on alias myös yksinkertaisesti nimellä ., joka suorittaa komentosarjan nykyisessä shell-ympäristössä alikuoren sijaan.

Seuraavat komennot ovat identtiset:

. script 

tai

source script 

kommentit

  • @Sony: Huomaa, että sinun tulisi käyttää return paeta tällä tavalla hankitulta komentosarjalta, ei exit – ne ovat kuin kuoritoiminnot ja exit poistuu komentosarjan lähteestä.
  • @CharlesStewart Itse asiassa en ’ ole perehtynyt lähdekoodeihin. Kiitos!
  • on source ./script sama?
  • @amyassin: kyllä, se on
  • 1. . ja source ovat yhtä suuria kuin bash. 2. emme ’ t on käytettävä ./ ennen tiedostonimeä, jos se ’ s on samassa hakemistossa. On hyvä suorittaa vain tämä: . script

Vastaa

Luo tämän tyyppisille pienille tehtäville komentosarjojen luomisen sijaan tällainen alias,

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

Lisää tämä .bashrc -tiedosto, jos haluat sen asetettavan jokaiselle interaktiiviselle kuorelle.

Nyt voit suorittaa tämän nimellä $ cdproj.

Kommentit

  • Voit myös antaa komentosarjan toistamaan suoritettavat komennot ja käyttää sitten eval `./script` tai eval $(./script) näiden komentojen suorittamiseksi. Tämä on yleinen lähestymistapa komentoille, joiden on päivitettävä kutsuva kuori ’ -ympäristö.
  • Ole varovainen antamiesi tietojen suhteen, jos aiot mennä eval -lähestymistapa.

Vastaa

Käytä exec bash lopussa

Bash-komentosarja toimii nykyisessä tai lastensa ympäristössä, mutta ei koskaan sen pääympäristö.

Tämä kysymys kuitenkin kysytään usein, koska halutaan jättää bashiin kehote tietyssä hakemistossa sen jälkeen, kun bash-komentosarja on suoritettu toisesta hakemistosta .

Jos näin on, suorita lapsen bash-ilmentymä lopussa komentosarjan:

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

Tämä luo uuden alikuoren. Kirjoita Ctrl + D tai exit palataksesi ensimmäiseen kuoreen, jossa komentosarja alun perin aloitettiin.

Päivitä

Ainakin bash uudemmilla versioilla viimeisen rivin exec ei enää ole tarpeen. Lisäksi komentosarja voidaan saada toimimaan minkä tahansa ensisijaisen kuoren kanssa käyttämällä ympäristömuuttujaa $SHELL. Tämä antaa sitten:

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

kommentit

  • Parempi vain hankkia komentosarja, kuten hyväksytyssä vastauksessa : Käyttämällä exec pidetään tyypillisesti huijauksen viimeisenä keinona .. 🙂
  • tämä temppu ei ole ’ t toimi debian 9 -joustossa.
  • Tämä on väärä tapa edetä tähän!
  • Koska kukaan ei ole kuvannut ongelmia tässä (katson sinua, @Dennis): (1) Joka kerta, kun suoritat tämän, se luo uuden, jatkuvan bash-prosessin. Tee se kymmenen tai kaksikymmentä kertaa istunnon aikana, ja sinulla on 11-21 bash-prosessia kasaantunut. Tämä voi vaikuttaa suorituskykyyn, ja jos yrität lopettaa istunnon puhtaasti kirjoittamalla exit (tai Ctrl + D), sinun on tehtävä se 11-21 kertaa. (2) Suoritettavan komentosarjan käytön toinen haittapuoli on, että jos asetat komentotulkkiasetuksia (esim. dotglob tai globstar) interaktiivinen kuori-istunto, menetät ne, koska olet aloittamassa uutta kuorta.
  • Erittäin mukava ratkaisu! Olen ’ kirjoittanut aliakseni uudestaan bash_profile-tiedostoon, joten nyt se on komentosarja, joka on tallennettu erilliseen tiedostoon. Käytän komentosarjaa siirtyäksesi äskettäin luotuun väliaikaiseen kansioon. Ja nyt on vielä helpompaa pitää väliaikainen bash-istunto. SRP toiminnassa! Kiitos!

vastaus

Vaikka on vastauksia, jotka suorittavat haluamasi toiminnot, vakiomuotoisempi menetelmä tarkoituksena on luoda symbolinen linkki:

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

Sitten voit cd hakemistoon käyttämällä nimeä proj:

cd proj 

Tämä menetelmä on joustavampi, koska voit käyttää tiedostoja lyhyellä nimellä ilman cd:

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

vastaus

Riippuu siitä, mitä ”Tulee tekemään, toinen ratkaisu voi olla toiminnon luominen komentosarjan sijaan.

Esimerkki:

Luo funktio tiedostoon, sanotaan” s ”/home/aidin/my-cd-script:

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

Liitä se sitten bashrc tai zshrc -tiedosto:

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

Nyt voit käyttää sitä komentona:

$ my-cd 

Vastaa

Jos vaihdat hakemistojen välillä kaukana tiedostojärjestelmässä. Suosittelen autojump .

vastaus

Minulle mukavin ja joustavin tapa oli sekoitus aliasta ja komentosarjaa:

luo komentosarja mielivaltaisella logiikalla

Täällä luon komentosarjan, joka muuttuu hakemistoksi ja aktivoi sopivan python-ympäristön. Komentosarjojen sijainti on ylimääräinen kohdassa /path/to/workon_myproj.sh.

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

luo aliaksen, joka lähtee komentosarjan

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

Lisää aliaksen määritelmä oikeaan shell-aloitustiedostoon, esim. .profile, .bashrc tai .zshrc.

tulos

Voit nyt yksinkertaisesti suorittaa workon_myproj komentotulkissa, joka hankkii komentosarjosi sisällön haluttuun hakemistoon.

laajennettavuus

Voit parantaa tapahtuman komentosarjaasi ottamalla argumentin, jotta se toimii useiden projektien kanssa tietyssä työhakemistossa, tai yhdistämällä sen git pull: iin saadaksesi viimeisimmät muutokset heti ja niin päällä … kaikki kattilalevyt, joita teet jatkaessasi tietyn projektin tekemistä.

Vastaa

Miksi et käytä ” exec ”se saumaa tekemään juuri sitä, mitä toivon.

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

Kommentit

  • Varo asioita, jotka näyttää olevan haluamasi. (Jättiläinen puuhevonen! Juuri mitä halusin!) Joka kerta kun suoritat tämän, se luo uuden, pysyvän bash-prosessin. Tee se kymmenen tai kaksikymmentä kertaa istunnossa, ja sinulla on 11-21 bash-prosessia pinottuina. Tämä voi vaikuttaa suorituskykyyn, ja jos yrität lopettaa istunnon puhtaasti kirjoittamalla exit (tai Ctrl + D), sinun on tehtävä se 11-21 kertaa.
  • Voin ehdottomasti nähdä, missä se olisi ongelma. Minulle kuitenkin ’ käytän sitä kerran, teen tarvitsemani työn ja poistun sitten. Jos tämä ’ on ainoa haittapuoli I voi elää sen kanssa. Toisaalta, jos on olemassa parempi ratkaisu, olen ’ halukas tarkastelemaan sitä.
  • Aidinin vastaus tähän kysymykseen kuoritoiminnon avulla ja Sachin Divekarin vastaus , joka käyttää aliasta, ovat (IMO) parempia ratkaisuja kuin komentosarjan käyttö . P.S. Toinen komentosarjan käytön haittapuoli on, että jos asetat mitään komentoasetuksia (esim. dotglob tai globstar), menetät ne, koska olet aloittamassa uutta kuorta. … (Jatkuu)
  • (jatkuu)… P.P.S. Huomasin juuri, että toistat periaatteessa Serge Stroobandtin vastauksen ja sanot Miksi et tekisi tätä? Stack Exchange odotamme vastausten tarjoavan uusia ideoita ja / tai tietoja, emmekä keskustele vain muista vastauksista.

Vastaa

Tämä yhdistää Sergein vastauksen Davidin -liittämättömään vastaukseen . Se muuttaa hakemistoa ja sitten sen sijaan, että pakottaisi bash-kuoren, se käynnistää käyttäjän oletuskuoren . sekä getent että /etc/passwd oletuskuoren havaitsemiseksi.

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

Tässä on tietysti sama puute sisäkkäisen kuoren luomisessa.

Vastaa

Voit tehdä sen käyttämällä funktiota tai käyttämällä & & Esimerkkejä paljastaen asentaa Zabbixin ja luo tiedosto, jonka sisällä on viiva.

Esimerkki:

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

tai:

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *