Thay đổi thư mục hiện tại từ tập lệnh Bash


190

Có thể thay đổi thư mục hiện tại từ một kịch bản?

Tôi muốn tạo một tiện ích để điều hướng thư mục trong Bash. Tôi đã tạo một kịch bản thử nghiệm trông giống như sau:

#!/bin/bash
cd /home/artemb

Khi tôi thực thi tập lệnh từ shell Bash, thư mục hiện tại không thay đổi. Có thể thay đổi thư mục shell hiện tại từ một tập lệnh không?


2
Chỉ là một đề xuất nâng cao: nếu bạn sử dụng pushd(có thể được chuyển hướng >/dev/nullđể triệt tiêu đầu ra của nó) thay vào đó cd, bạn có thể quay lại thư mục trước đó với popd.
mkuity0

Câu trả lời:


173

Bạn cần chuyển đổi tập lệnh của mình sang hàm shell:

#!/bin/bash
#
# this script should not be run directly,
# instead you need to source it from your .bashrc,
# by adding this line:
#   . ~/bin/myprog.sh
#

function myprog() {
  A=$1
  B=$2
  echo "aaa ${A} bbb ${B} ccc"
  cd /proc
}

Lý do là mỗi quy trình có thư mục hiện tại của riêng nó và khi bạn thực thi một chương trình từ trình bao thì nó được chạy trong một quy trình mới. Tiêu chuẩn "cd", "pushd" và "popd" được tích hợp vào trình thông dịch shell để chúng ảnh hưởng đến quá trình shell.

Bằng cách biến chương trình của bạn thành hàm shell, bạn đang thêm lệnh trong tiến trình của riêng mình và sau đó mọi thay đổi thư mục sẽ được phản ánh trong tiến trình shell.


2
Làm thế nào bạn sẽ làm điều này trong tcsh?
joedborg

4
+1. Một điều mà tôi nhận thấy là trong tệp, chúng ta phải xác định hàm trước khi gọi nó. Nó có thể giúp một người thiếu kinh nghiệm như tôi.
Bhushan

Sự khác biệt lớn giữa việc xác định hàm và tạo bí danh là gì?
HelloGoodbye

1
Khi tôi đã tạo tệp myprog.sh này và thêm nó vào .bashrc, làm cách nào để chạy tập lệnh? Tôi nên gọi hàm của mình từ tệp shell khác hoặc trực tiếp từ shell? Dường như nó không hoạt động theo bất kỳ cách nào ...
Andrea Silvestri

1
@AndreaSilvestri Hoặc đăng xuất và đăng nhập lại hoặc nguồn .bashrc. Thêm nó vào .bashrc không làm gì cả cho đến khi .bashrc được chạy.
Jon Strayer

213

Khi bạn bắt đầu tập lệnh của mình, một quy trình mới được tạo ra chỉ kế thừa môi trường của bạn. Khi nó kết thúc, nó kết thúc. Môi trường hiện tại của bạn vẫn như cũ.

Thay vào đó, bạn có thể bắt đầu tập lệnh của mình như thế này:

. myscript.sh

Ý .chí sẽ đánh giá tập lệnh trong môi trường hiện tại, vì vậy nó có thể bị thay đổi


4
+1 vì bạn đúng. Mặc dù tôi thực sự nghi ngờ rằng anh ấy sẽ muốn tìm một thư mục thay đổi tập lệnh mỗi khi anh ấy cần nó. Hơn nữa, .shphần mở rộng là hoàn toàn eww. Đừng sử dụng chúng.
lhunath

1
Có, thường thì tốt hơn là không sử dụng nó theo cách đó. Hầu hết thời gian bạn vui mừng vì môi trường hiện tại của bạn không bị ảnh hưởng. Nhưng sau đó tôi có các kịch bản để thực hiện một số tác vụ thiết lập cho tôi bao gồm thay đổi đến đúng nơi và sau đó tôi. họ cũng vậy. Btw. .sh tất nhiên là một vấn đề của phong cách cá nhân. Tôi có thể sẽ không sử dụng nó trong khi cài đặt hệ thống script rộng. Nhưng trong tôi ~ / bin Tôi sử dụng chúng để biết là những gì những gì :)
Norbert Hartl

11
@lhunath Tại sao các phần mở rộng .sh hoàn toàn eww?
Carl Pritchett


1
Đối với tôi lý do trong bài viết đó là không có thật. Có vẻ như kết quả đã được biết trước nhưng việc tìm ra lý do cho nó không dễ dàng như vậy. Vì vậy, tôi đứng quan điểm của tôi đó là một vấn đề của phong cách cá nhân, không có gì khác.
Norbert Hartl

55

Trong bối cảnh không thể đọc được và quá phức tạp của các câu trả lời, tôi tin rằng đây là những gì người yêu cầu nên làm

  1. thêm tập lệnh đó vào PATH
  2. chạy tập lệnh như . scriptname

Các .(dot) sẽ đảm bảo rằng các kịch bản không được chạy trong một vỏ con.


38

Đặt các mục trên lại với nhau, bạn có thể tạo bí danh

alias your_cmd=". your_cmd"

nếu bạn không muốn viết "." mỗi lần bạn muốn chuyển tập lệnh của mình sang môi trường shell hoặc nếu bạn không muốn nhớ thì phải thực hiện để tập lệnh hoạt động chính xác.


Điều này sẽ ở lại liên tục trên khởi động lại?
SDsolar

1
@SDsolar Bạn cần thêm tệp này vào tệp ~ / .bashrc của mình để duy trì liên tục. Hoạt động như một cơ duyên đối với tôi.
Rafał G.

Có thể được đặt trong ~ / .bash_aliases
Champ

@Champ ~/.bash_aliaseskhông phải lúc nào cũng có nguồn gốc khi Bash ra mắt.
Mateusz Piotrowski

31

Nếu bạn đang sử dụng bash, bạn có thể thử bí danh:

vào tệp .bashrc thêm dòng này:

alias p='cd /home/serdar/my_new_folder/path/'

Khi bạn viết "p" trên dòng lệnh, nó sẽ thay đổi thư mục.


1
+1 cho bí danh. Hàm shell rất thú vị nhưng OP yêu cầu một điều hướng đơn giản với cd. Tôi đoán hầu hết mọi người cần một tập lệnh như thế này để điều hướng các nhánh mã nguồn và với bí danh đó là đủ
Brad Dre

19

Nếu bạn chạy một tập lệnh bash thì nó sẽ hoạt động trên môi trường hiện tại của nó hoặc trên những đứa trẻ của nó, không bao giờ trên cha mẹ.

Nếu mục tiêu là chạy lệnh của bạn: goto.sh / home / test Sau đó, làm việc tương tác trong / home / test một cách là chạy một chuỗi con tương tác bash trong tập lệnh của bạn:

#!/bin/bash
cd $1
exec bash

Bằng cách này, bạn sẽ ở trong / home / test cho đến khi bạn thoát (thoát hoặc Ctrl + C) của shell này.


Tôi nghĩ rằng điều này sẽ khắc phục vấn đề cho một kịch bản shell mà tôi đang chạy nhưng thay vào đó, nó khởi động shell và quên đi những gì tôi muốn.
vwvan

13

Với Pushd , thư mục hiện tại được đẩy vào ngăn xếp thư mục và nó được thay đổi thành thư mục đã cho, popd lấy thư mục trên đầu ngăn xếp và sau đó thay đổi nó.

pushd ../new/dir > /dev/null
# do something in ../new/dir
popd > /dev/null

2
Điều này trả lời câu hỏi của tôi - tích cực triển khai giải pháp này với tập lệnh init S3 và nó hoạt động hoàn toàn tốt. Cảm ơn @seb.
19h

5

Đơn giản chỉ cần đi đến

yourusername/.bashrc (or yourusername/.bash_profile on MAC) by an editor

và thêm mã này bên cạnh dòng cuối cùng:

alias yourcommand="cd /the_path_you_wish"

Sau đó bỏ biên tập.

Sau đó gõ:

source ~/.bashrc or source ~/.bash_profile on MAC.

bây giờ bạn có thể sử dụng: yourcommand in terminal



3

Về cơ bản chúng tôi sử dụng cd..để trở lại từ mọi thư mục. Tôi nghĩ làm cho nó dễ dàng hơn bằng cách đưa ra số lượng thư mục mà bạn cần quay lại tại một thời điểm. Bạn có thể thực hiện điều này bằng cách sử dụng tệp tập lệnh riêng bằng lệnh bí danh. Ví dụ:

mã.sh

#!/bin/sh
 _backfunc(){
 if [ "$1" -eq 1 ]; then
  cd ..
 elif [ "$1" -eq 2 ]; then
  cd ../..
 elif [ "$1" -eq 3 ]; then
  cd ../../..
 elif [ "$1" -eq 4 ]; then
  cd ../../../..
 elif ["$1" -eq 10]; then
  cd /home/arun/Documents/work
 fi
 }
alias back='_backfunc'   

Sau khi sử dụng source code.shtrong trình bao hiện tại, bạn có thể sử dụng:

$back 2 

để trở lại hai bước từ thư mục hiện tại. Giải thích chi tiết ở đây . Người ta cũng giải thích về cách đặt mã vào ~ / .bashrc để mọi shell mới được mở sẽ tự động có lệnh bí danh mới này. Bạn có thể thêm lệnh mới để đi đến các thư mục cụ thể bằng cách sửa đổi mã bằng cách thêm nhiều if conditionsđối số khác nhau. Bạn cũng có thể kéo mã từ git qua đây .


Giải pháp tuyệt vời, vì vậy bạn không bao giờ làm
hỏng

0

Cách tiếp cận này dễ dàng hơn đối với tôi.

Giả sử trên iMac cá nhân nơi bạn là quản trị viên, trong thư mục mặc định khi cửa sổ lệnh được mở, / Users / jdoe, đây sẽ là thư mục để truy cập: /Users/jdoe/Desktop/Mongo/db.3.2.1 /thùng rác.

Đây là các bước có thể hoàn thành công việc:

  1. vi mongobin, trong đó tôi đã nhập: cd /Users/jdoe/Desktop/Mongo/db.3.2.1/binlà dòng đầu tiên.
  2. chmod 755 mongobin
  3. source mongobin
  4. pwd

Voila!


0

Tôi cũng đã tạo một tiện ích gọi là mà bạn có thể sử dụng để điều hướng dễ dàng hơn.

Bạn có thể xem mã nguồn trên GitHub .

Kể từ v2.3.1 , tổng quan về cách sử dụng trông như thế này:

# Create a link (h4xdir) to a directory:
goat h4xdir ~/Documents/dev

# Follow a link to change a directory:
cd h4xdir

# Follow a link (and don't stop there!):
cd h4xdir/awesome-project

# Go up the filesystem tree with '...' (same as `cd ../../`):
cd ...

# List all your links:
goat list

# Delete a link (or more):
goat delete h4xdir lojban

# Delete all the links which point to directories with the given prefix:
goat deleteprefix $HOME/Documents

# Delete all saved links:
goat nuke

# Delete broken links:
goat fix

0

Tôi thích làm điều tương tự cho các dự án khác nhau mà không tạo ra một lớp vỏ mới.

Trong trường hợp của bạn:

cd /home/artemb

Lưu the_script dưới dạng:

echo cd /home/artemb

Sau đó kích hoạt nó với:

\`./the_script\`

Sau đó, bạn nhận được vào thư mục sử dụng cùng một vỏ.



0

Khai báo đường dẫn của bạn:

PATH='/home/artemb'     
cd ${PATH}

0

Chỉ cần viết PWDvà xuất nó trong tập lệnh của bạn, và sự thay đổi sẽ tiếp tục.

export PWD=/your/desired/directory
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.