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
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`
taieval $(./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
taiglobstar
) 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
taiglobstar
), 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
return
paeta tällä tavalla hankitulta komentosarjalta, eiexit
– ne ovat kuin kuoritoiminnot jaexit
poistuu komentosarjan lähteestä.source ./script
sama?.
jasource
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