mengubah direktori kerja saat ini dengan skrip

8

Saya sudah membaca ini pertanyaan dan jawaban, tetapi tidak berhenti pas masalah saya, bahkan tho itu serupa.

Saya sedang menulis skrip (disebut cpj) yang akan meluncurkan salah satu proyek saya saat ini. Saya memiliki sekitar 5 dari mereka. Saat saya mengetik

$ cpj blah

Saya ingin direktori kerja saat ini berubah ke direktori proyek bla (yang saya simpan dalam $ PROJDIR) dan saya ingin emacsclient untuk membuka file utama untuk proyek itu (yang saya pegang dalam $ MAINFILE).

Pertanyaan yang saya kutip mengatakan bahwa Anda tidak dapat secara langsung mengubah lingkungan shell yang menjalankan skrip, tetapi Anda dapat sumber skrip dan itu akan melakukannya.

Untuk menguji ini saya menulis skrip shell (disebut chcwd) yang memiliki satu baris:

cd $1

Jika, dari baris perintah saya lakukan:

$ . chcwd $PROJDIR

direktori kerja saya saat ini akan berubah sesuai keinginan saya. Sebaliknya, jika dari skrip cpj saya, saya memiliki baris yang sama:

. chcwd $PROJECT

itu tidak akan mengubah direktori kerja shell saat ini. Saya menyadari bahwa saya menjalankan 2 skrip (cpj dan kemudian chcwd), dan dengan demikian membuat 2 shell, tapi saya tidak melihat cara untuk menyelesaikan apa yang saya inginkan. Adakah yang bisa menunjukkan kepada saya bagaimana mencapai tujuan saya?

bev
sumber

Jawaban:

11

Anda tidak dapat memiliki kue dan memakannya juga. Dua hal yang terjadi di sini adalah menjalankan skrip di shell baru dan mengimpor baris skrip untuk dijalankan di shell saat ini. Dengan menggunakan operator titik (yang merupakan alias untuk sourceperintah) Anda sebenarnya menjalankan kode di shell Anda saat ini . Jika kode Anda memilih untuk cd, ketika selesai Anda akan ditinggalkan di direktori baru.

Jika di sisi lain Anda ingin menjalankan program (atau skrip, itu tidak masalah), program itu akan diluncurkan sebagai sub-proses. Dalam hal skrip shell, sebuah shell baru akan dibuka dan kode dijalankan di dalamnya. Setiap cdtindakan yang diambil akan mengubah direktori kerja saat ini untuk shell yang, efektif untuk setiap perintah untuk mengikuti. Ketika pekerjaan selesai, shell akan keluar, meninggalkan Anda kembali ke shell asli (dan tidak dimodifikasi).

Jika itu adalah sesuatu yang sering Anda gunakan dan Anda ingin efeknya tertinggal di shell Anda saat ini, mungkin Anda bisa menulis "script" Anda sebagai fungsi shell dan menyimpannya di ~ / .profile atau file shell rc lainnya.

function cpj() {
    # code here
    cd /path/$1
    emacs file_name
}
Caleb
sumber
Caleb, terima kasih atas masukan Anda. Saya suka permainan kata-kata Anda. Paragraf pertama Anda menyatakan kembali apa yang saya katakan dalam pertanyaan saya dengan mengagumkan. Paragraf kedua Anda menyatakan kembali apa yang dikatakan dalam pertanyaan yang saya kutip dengan cukup baik. Paragraf ketiga Anda persis dan tepat seperti yang saya cari! Terima kasih Bung.
bev
2

Saya memiliki skrip serupa yang ditulis untuk penggunaan pribadi saya. Ada trik yang sangat mudah untuk mencapai perubahan direktori kerja di dalam skrip. Pertama, cukup tulis skrip Anda, in.ex .:

#!/bin/bash

case $1 in
     project1) cd /home/me/work/customer1/project1
     ;;
     project2) cd /home/me/work/customer2/project1
     ;;
     project3) cd /home/me/work/customer3/project2
     ;;
     project4) cd /home/me/work/customer4/project5
     ;;
     *) echo "Usage: cdto cd_profile_name"
     ;;
esac

Sekarang mari kita asumsikan skrip ini disebut 'cdto'. Untuk membuatnya berfungsi, Anda harus sumbernya di shell saat ini, apa yang bisa dicapai dengan 'sumber' atau '.' perintah (keduanya sama). Dalam ex .:

. cdto project1

Sekarang untuk membuatnya lebih nyaman:

  1. Salin skrip 'cdto' ke direktori 'tempat sampah' di akun Anda (masuk. / Home / johnsmith / bin - buat jika tidak ada). Periksa variabel PATH Anda untuk memastikan direktori 'nampan' disertakan:

    echo $ PATH

Jika tidak, edit file profil. Anda dan tambahkan:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
  1. Tambahkan alias ke file .bashrc atau .bash_aliases Anda:

    alias cdto = '. cdto '

Dan sudah selesai. Setelah login berikutnya atau ketika Anda membuka terminal baru Anda bisa menggunakan in.ex .:

cdto project1

Nikmati :-)

Sebastian Piech

Sebastian Piech
sumber
0

Trik sederhana untuk melakukan ini:

pushd $PROJDIR && bash

Sekarang dir berfungsi adalah $ PROYEK.

artificerpi
sumber