thay đổi thư mục làm việc hiện tại với một tập lệnh


8

Tôi đã đọc này câu hỏi và câu trả lời, nhưng nó không bỏ phù hợp với vấn đề của tôi, thậm chí tho nó tương tự.

Tôi đang viết một kịch bản (được gọi là cpj) sẽ khởi chạy một trong những dự án hiện tại của tôi. Tôi có khoảng 5 người trong số họ. Khi tôi gõ

$ cpj blah

Tôi muốn thư mục làm việc hiện tại thay đổi thành thư mục dự án blah (mà tôi giữ trong $ PROJDIR) và tôi muốn emacsclient mở tệp chính cho dự án đó (mà tôi giữ trong $ MAINFILE).

Câu hỏi tôi đã trích dẫn nói rằng bạn không thể trực tiếp thay đổi môi trường của trình bao chạy tập lệnh, nhưng bạn có thể lấy một tập lệnh và nó sẽ làm như vậy.

Để kiểm tra điều này, tôi đã viết một kịch bản shell (được gọi là chcwd) có một dòng:

cd $1

Nếu, từ dòng lệnh tôi làm:

$ . chcwd $PROJDIR

thư mục làm việc hiện tại của tôi sẽ thay đổi như tôi mong muốn. Mặt khác, từ tập lệnh cpj của tôi, tôi có cùng một dòng:

. chcwd $PROJECT

nó sẽ không thay đổi thư mục làm việc hiện tại của shell. Tôi nhận ra rằng tôi đang chạy 2 tập lệnh (cpj và sau đó là chcwd), và vì vậy, tạo 2 shell, nhưng tôi thấy không có cách nào để thực hiện những gì tôi muốn. Bất cứ ai có thể chỉ cho tôi làm thế nào để thực hiện mục tiêu của tôi?

Câu trả lời:


11

Bạn không thể có bánh của bạn ăn nó quá. Hai điều xảy ra ở đây là thực thi một tập lệnh trong trình bao mới và nhập các dòng tập lệnh sẽ được chạy trong trình bao hiện tại. Bằng cách sử dụng toán tử dấu chấm (là bí danh cho sourcelệnh), bạn thực sự đang chạy mã trong trình bao hiện tại của mình . Nếu mã của bạn chọn cd, khi hoàn thành, bạn sẽ bị bỏ lại trong thư mục mới.

Mặt khác, nếu bạn muốn thực thi một chương trình (hoặc tập lệnh, thì nó không thành vấn đề), chương trình đó sẽ được khởi chạy như một quy trình phụ. Trong trường hợp shell script, shell mới sẽ được mở và mã chạy bên trong nó. Bất kỳ cdhành động nào được thực hiện sẽ thay đổi thư mục làm việc hiện tại cho shell đó, có hiệu lực đối với bất kỳ lệnh nào cần tuân theo. Khi công việc hoàn thành, trình bao sẽ thoát ra, đưa bạn trở lại trình bao ban đầu (và chưa sửa đổi).

Nếu đó là thứ bạn sử dụng nhiều và bạn muốn các hiệu ứng của nó bị bỏ lại trong lớp vỏ hiện tại của mình, có lẽ bạn có thể viết "tập lệnh" của mình dưới dạng hàm shell thay vào đó và lưu nó vào tập tin ~ / .profile hoặc shell shell khác của bạn.

function cpj() {
    # code here
    cd /path/$1
    emacs file_name
}

Caleb, thx cho đầu vào của bạn. Tôi thích cách chơi chữ của bạn. Đoạn đầu tiên của bạn nói lại những gì tôi nói trong câu hỏi của tôi một cách đáng ngưỡng mộ. Đoạn thứ hai của bạn nói lại những gì đã nói trong câu hỏi tôi đã trích dẫn khá tốt. Đoạn thứ ba của bạn là chính xác và chính xác những gì tôi đang tìm kiếm! Cảm ơn anh bạn.
bev

2

Tôi có kịch bản tương tự được viết cho sử dụng cá nhân của tôi. Có một mẹo rất dễ dàng để đạt được thư mục làm việc thay đổi bên trong một tập lệnh. Đầu tiên chỉ cần viết kịch bản của bạn, 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

Bây giờ, giả sử tập lệnh được gọi là 'cdto'. Để làm cho nó hoạt động, bạn phải tìm nguồn trong trình bao hiện tại, những gì có thể đạt được bằng 'nguồn' hoặc '.' lệnh (cả hai đều giống nhau). Trong ví dụ:

. cdto project1

Bây giờ để làm cho nó thuận tiện hơn:

  1. Sao chép tập lệnh 'cdto' vào thư mục 'bin' trong tài khoản của bạn (ví dụ: / Home / johnsmith / bin - tạo tập lệnh nếu không tồn tại). Kiểm tra biến PATH của bạn để đảm bảo thư mục 'bin' được bao gồm:

    tiếng vang $ PATH

Nếu không, hãy chỉnh sửa tệp .profile của bạn và thêm:

if [ -d "$HOME/bin" ] ; then
    PATH="$HOME/bin:$PATH"
fi
  1. Thêm bí danh vào tệp .bashrc hoặc .bash_aliases của bạn:

    bí danh cdto = '. cdto '

Và thế là xong. Sau lần đăng nhập tiếp theo hoặc khi bạn mở một thiết bị đầu cuối mới, bạn chỉ có thể sử dụng in.ex.:

cdto project1

Thưởng thức :-)

Sebastian Piech


0

Một mẹo đơn giản để làm điều này:

pushd $PROJDIR && bash

Bây giờ thư mục làm việc là $ DỰ ÁN.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.