Saya ingin menjalankan skrip untuk mengubah direktori kerja saat ini:
#!/bin/bash
cd web/www/project
Tapi, setelah saya jalankan, pwd saat ini tetap tidak berubah! Bagaimana saya bisa melakukan itu?
Saya ingin menjalankan skrip untuk mengubah direktori kerja saat ini:
#!/bin/bash
cd web/www/project
Tapi, setelah saya jalankan, pwd saat ini tetap tidak berubah! Bagaimana saya bisa melakukan itu?
Jawaban:
Itu adalah perilaku yang diharapkan, dan sudah dibahas beberapa kali.
Script dijalankan dalam subkulit, dan tidak dapat mengubah direktori kerja shell induk. Efeknya hilang ketika selesai.
Untuk mengubah direktori secara permanen Anda harus sumber skrip, seperti pada
. ./script
source ./script
sama?
.
dan source
sama di bash. 2. kita tidak perlu menggunakan ./
sebelum nama file jika itu di direktori yang sama. Tidak masalah menjalankan hanya ini:. script
Untuk tugas kecil seperti ini, alih-alih membuat skrip, buat alias seperti ini,
$ alias cdproj='cd /dir/web/www/proj'
Anda harus menambahkan ini ke .bashrc
file Anda , jika Anda ingin mengaturnya untuk setiap shell interaktif.
Sekarang Anda dapat menjalankan ini sebagai $ cdproj
.
eval `./script`
atau eval $(./script)
menjalankan perintah tersebut. Ini adalah pendekatan umum untuk perintah yang perlu memperbarui lingkungan shell yang memohon.
eval
pendekatan.
exec bash
di akhirSkrip bash beroperasi pada lingkungan saat ini atau pada anak-anaknya, tetapi tidak pernah pada lingkungan orang tuanya.
Namun, pertanyaan ini sering ditanyakan karena seseorang ingin ditinggalkan di bash prompt di direktori tertentu setelah eksekusi skrip bash dari direktori lain.
Jika ini masalahnya, jalankan saja instance bash anak di akhir skrip:
#!/usr/bin/env bash
cd desired/directory
exec bash
Ini menciptakan subkulit baru. Ketik exit
untuk kembali ke shell pertama tempat skrip awalnya dimulai.
exec
biasanya dianggap sebagai upaya terakhir dari bajingan .. :)
exit
(atau Ctrl + D), Anda harus melakukannya 11 hingga 21 kali. (2) Kelemahan lain dari menggunakan skrip yang dapat dieksekusi adalah, jika Anda mengatur opsi shell (misalnya, dotglob
atau globstar
) dalam sesi shell interaktif Anda, Anda akan kehilangan mereka, karena Anda memulai shell baru.
Meskipun ada jawaban yang melakukan tindakan tepat yang Anda inginkan, metode yang lebih standar untuk tujuan tersebut adalah membuat tautan simbolis:
ln -s ~/web/www/project proj #use full path to dir!
Kemudian Anda bisa cd
ke direktori menggunakan nama proj
:
cd proj
Metode ini lebih fleksibel karena Anda dapat mengakses file menggunakan nama pendek tanpa cd
:
ls proj/ #note the endslash!
vim proj/file.x
Bergantung pada apa yang akan Anda lakukan, solusi lain dapat membuat fungsi alih-alih skrip.
Contoh:
Buat fungsi dalam file, katakanlah /home/aidin/my-cd-script
:
function my-cd() {
cd /to/my/path
}
Kemudian sertakan dalam bashrc
atau zshrc
file Anda:
# Somewhere in rc file
source /home/aidin/my-cd-script
Sekarang Anda dapat menggunakannya seperti perintah:
$ my-cd
Mengapa tidak menggunakan "exec" untuk melakukan apa yang saya inginkan.
#!/bin/bash
cd someplace
exec bash
~/someplace
exit
(atau Ctrl + D), Anda harus melakukannya 11 hingga 21 kali.
dotglob
atau globstar
), Anda akan kehilangan mereka, karena Anda memulai shell baru. … (Lanjutan)
Anda dapat melakukannya menggunakan fungsi atau menggunakan && Contoh di bawah menginstal Zabbix dan membuat file dengan garis di dalamnya.
Ex:
#!/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
atau:
#!/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
untuk melarikan diri dari skrip yang bersumber dengan cara ini, tidakexit
- mereka seperti fungsi shell, danexit
akan keluar dari shell yang bersumber skrip.