Tại sao không có cd cd làm việc trong một kịch bản shell?


766

Tôi đang cố gắng viết một tập lệnh nhỏ để thay đổi thư mục hiện tại vào thư mục dự án của mình:

#!/bin/bash
cd /home/tree/projects/java

Tôi đã lưu tệp này dưới dạng proj, thêm quyền thực thi chmodvà sao chép nó vào /usr/bin. Khi tôi gọi nó bằng cách: projnó không làm gì cả. Tôi đang làm gì sai?


10
trùng lặp trang web: superuser.com/questions/176783/ từ
lesmana

Trong tương lai, bạn luôn có thể thử kiểm tra nó pwdtrên dòng cuối cùng. Vì vậy, trước khi kịch bản kết thúc thì bạn có thể kiểm tra xem nó có hoạt động hay không ..
sobi3ch

5
@lesmana sao lại thế?
aland

@aland Bởi vì OP không không trên thực tế chạy kịch bản, đó là lý do tại sao dir làm việc không thay đổi cho anh ta. cdlệnh hoạt động tốt bên trong các kịch bản, cố gắng cho chính mình.
Alexander Gonchiy

Câu trả lời:


634

Các kịch bản Shell được chạy bên trong một lớp con và mỗi lớp con có khái niệm riêng về thư mục hiện tại là gì. Thành cdcông, nhưng ngay khi lớp vỏ phụ thoát ra, bạn quay lại vỏ tương tác và không có gì thay đổi ở đó.

Một cách để khắc phục điều này là sử dụng bí danh thay thế:

alias proj="cd /home/tree/projects/java"

7
Bí danh không linh hoạt để quản lý hoặc thay đổi. Trong trường hợp nhiều 'cd', tập lệnh có thể tốt hơn.
Thevs

16
Các chức năng linh hoạt hơn các bí danh, vì vậy đó là nơi bạn sẽ tìm kiếm tiếp theo khi bí danh không đủ.
ephemient

4
Có đáng chú ý rằng trên MS-DOS, hành vi của các tập lệnh là một tập lệnh được gọi có thể thay đổi thư mục (và thậm chí cả ổ đĩa) của vỏ lệnh gọi không? Và Unix không có khuyết điểm này?
Jonathan Leffler

23
Jonathan: trong khi đó là sự thật, nó không thực sự liên quan đến câu hỏi. Câu trả lời về SO sẽ nhận được gấp đôi thời gian nếu họ phải liệt kê từng thiếu sót tương ứng trong MS-DOS!
Greg Hewgill

17
Một cách khác để khắc phục điều đó là tìm nguồn tệp script: . my-scripthoặc source my-script.
HelloGoodbye

503

Bạn không làm gì sai! Bạn đã thay đổi thư mục, nhưng chỉ trong phạm vi con chạy tập lệnh.

Bạn có thể chạy tập lệnh trong quy trình hiện tại của mình bằng lệnh "dot":

. proj

Nhưng tôi thích đề xuất của Greg hơn là sử dụng bí danh trong trường hợp đơn giản này.


95
.cũng được đánh vần source, chọn bất cứ điều gì bạn thấy đáng nhớ hơn.
ephemient

47
@Ephemient: Nguồn điểm tốt Điều đó giải thích lý do tại sao nó hoạt động cũng chứng minh rằng sự lười biếng - không cần thiết - thường là mẹ của sáng chế
Adam Liss

8
@ephemient: lưu ý rằng nguồn được sử dụng trong C shell và Bash; nó không được hỗ trợ trong vỏ POSIX hoặc Korn, cũng như trong vỏ Bourne cổ điển.
Jonathan Leffler

2
"nguồn" được sử dụng trong Z-shell
Nathan Moos

1
@AdamLiss Nó hoạt động rất tốt, nhưng có một nhược điểm - bằng cách nào đó, lệnh nguồn / dấu chấm sẽ vô hiệu hóa khả năng tự động hoàn thành tên của tập lệnh / lệnh bằng phím TAB. Vẫn có thể thêm đối số / đầu vào bằng khóa TAB, nhưng không may là tên của lệnh cần được nhập trực tiếp. Bạn có biết làm thế nào để làm cho khóa TAB hoạt động trong trường hợp này?
Rafal

215

Tập cdlệnh của bạn về mặt kỹ thuật đã hoạt động khi nó thay đổi thư mục của shell chạy tập lệnh, nhưng đó là một quá trình riêng rẽ tách khỏi trình bao tương tác của bạn.

Một cách tương thích với Posix để giải quyết vấn đề này là xác định thủ tục shell chứ không phải là tập lệnh lệnh được gọi bằng shell .

jhome () {
  cd /home/tree/projects/java
}

Bạn chỉ có thể nhập nó vào hoặc đặt nó vào một trong các tệp khởi động shell khác nhau.


6
Tôi đồng ý, đây là câu trả lời tốt nhất, bị lỗi. Ngoài ra, bí danh có thể phù hợp trong một số trường hợp nhưng nếu anh ta cố gắng sử dụng cd trong tập lệnh và muốn thêm bất cứ điều gì khác vào đó thì bí danh sẽ là vô ích.
Justin Buser

4
Đây trông giống như một giải pháp! Và tôi đang cố gắng để thực hiện nó, nhưng nó không thực hiện :( đây là kịch bản của tôi: # / bin / bash jhome () {echo "xin vui lòng" cd / echo nhà "làm việc"} jhome!
Gant Laborde

1
@GantMan, bạn nên thêm phần này vào "tệp khởi động shell", như ~ / .bashrc
Jackie Yeh

3
Bạn cũng có thể sử dụng một đối số (hoặc hai ...), tức là:jhome(){ cd /home/tree/projects/$1; }
irbanana

1
Đây phải là cách đúng đắn, điều này cho phép sử dụng các ký tự đặc biệt, ví dụ như "-".
bangkokguy

159

Điều cdnày được thực hiện trong vỏ của tập lệnh. Khi tập lệnh kết thúc, shell đó sẽ thoát, và sau đó bạn được để lại trong thư mục bạn đang có. "Nguồn" tập lệnh, không chạy nó. Thay vì:

./myscript.sh

làm

. ./myscript.sh

(Lưu ý dấu chấm và dấu cách trước tên tập lệnh.)


2
Điều này là mát mẻ, và có lẽ là tốt để biết. Cái sau làm chính xác cái gì (nó hoạt động như thế nào)? Đây có lẽ là giải pháp tốt nhất về chủ đề này.
Giô-na

2
fwiw, trong phần bình luận của câu trả lời của Adam Liss, phù du trả lời câu hỏi '.' Là. Nó giống nhưsource
g19fanatic

1
Hãy cẩn thận, "nguồn" là một bashism. tức là dấu gạch ngang (mặc định Debian cho / bin / sh) không hỗ trợ nó, trong khi "." hoạt động như mong đợi.
allo

Câu trả lời chính xác! ngoài ra nếu myscript.shtrong một thư mục có trong $ PATH, bạn có thể lấy nó từ bất cứ đâu mà không chỉ định đường dẫn đầy đủ.
CodeBrew

Điều này làm việc cho tôi tốt nhất. Giải pháp này là đơn giản nhất (+1).
HuserB1989

96

Để tạo một tập lệnh bash sẽ cd vào một thư mục được chọn:

Tạo tập tin kịch bản

#! / thùng / sh
# tệp: / scripts / cdjava
#
cd / home / Askgelal / dự án / java

Sau đó tạo một bí danh trong tệp khởi động của bạn.

#! / thùng / sh
# tập tin /scripts/mastercode.sh
#
bí danh cdjava = '. / script / cdjava '

  • Tôi đã tạo một tệp khởi động trong đó tôi kết xuất tất cả các bí danh và các chức năng tùy chỉnh của mình.
  • Sau đó, tôi lấy tệp này vào .bashrc để đặt nó trên mỗi lần khởi động.

Ví dụ: tạo tệp bí danh / hàm chính: /scripts/mastercode.sh
(Đặt bí danh trong tệp này.)

Sau đó, ở cuối tệp .bashrc của bạn :

nguồn /scripts/mastercode.sh



Bây giờ thật dễ dàng để cd vào thư mục java của bạn, chỉ cần gõ cdjava và bạn đang ở đó.


2
tệp mastercode.shkhông cần shabang ( #!/bin/sh), vì nó không (và không thể) được thực thi trong một khung con. Nhưng đồng thời, bạn cần phải ghi lại "hương vị" của tập tin này; ví dụ: ksh hoặc bash (hoặc (t) csh / zsh, v.v.) và gần như chắc chắn là không thực sự sh. Tôi thường thêm một bình luận (nhưng không phải là shebang) để truyền đạt điều này; ví dụ: "tệp này có nghĩa là có nguồn gốc (từ bash), không chạy dưới dạng tập lệnh shell."
michael

Một mẹo khác (đối với bash): nếu bạn sử dụng các biến trong tập lệnh của mình, thì khi tập lệnh đang được sourced (thông qua alias), các biến đó sẽ bị rò rỉ vào môi trường shell của bạn. Để tránh điều đó, hãy thực hiện tất cả công việc của tập lệnh trong một hàm và chỉ cần gọi nó ở cuối tập lệnh. Trong hàm, khai báo bất kỳ biến nào local.
Đại hoàng

trong ubfox chỉ cần tạo ~ / .bash_aliases (nếu nó chưa tồn tại). Sau đó, chỉ cần thêm bí danh của bạn ở đó, khởi động lại thiết bị đầu cuối và bạn đã hoàn thành.
Vlad

51

Bạn có thể sử dụng .để thực thi một tập lệnh trong môi trường shell hiện tại:

. script_name

hoặc cách khác, bí danh cụ thể hơn nhưng dễ đọc hơn của nó source:

source script_name

Điều này tránh lớp vỏ con và cho phép bất kỳ biến hoặc tích hợp (bao gồm cd) nào ảnh hưởng đến lớp vỏ hiện tại thay thế.


38

Ý tưởng sử dụng một liên kết tượng trưng của Jeremy Ruten đã kích hoạt một ý nghĩ không vượt qua bất kỳ câu trả lời nào khác. Sử dụng:

CDPATH=:$HOME/projects

Đại tràng hàng đầu là quan trọng; điều đó có nghĩa là nếu có một thư mục 'dir' trong thư mục hiện tại, thì ' cd dir' sẽ thay đổi thành thư mục đó, thay vì nhảy ra khỏi một nơi khác. Với giá trị được đặt như hiển thị, bạn có thể làm:

cd java

và, nếu không có thư mục con được gọi là java trong thư mục hiện tại, thì nó sẽ đưa bạn trực tiếp đến $ HOME / dự án / java - không có bí danh, không có tập lệnh, không có lệnh thực thi hoặc lệnh dấu chấm.

$ HOME của tôi là / Người dùng / jleffler; $ CDPATH của tôi là:

:/Users/jleffler:/Users/jleffler/mail:/Users/jleffler/src:/Users/jleffler/src/perl:/Users/jleffler/src/sqltools:/Users/jleffler/lib:/Users/jleffler/doc:/Users/jleffler/work

31

Sử dụng exec bashở cuối

Một tập lệnh bash hoạt động trên môi trường hiện tại của nó hoặc trên môi trường con cái của nó, nhưng không bao giờ trên môi trường cha mẹ của nó.

Tuy nhiên, câu hỏi này thường được hỏi vì người ta muốn để lại dấu nhắc bash (mới) trong một thư mục nhất định sau khi thực thi tập lệnh bash từ thư mục khác.

Nếu đây là trường hợp, chỉ cần thực hiện một cá thể bash con ở cuối tập lệnh:

#!/usr/bin/env bash
cd /home/tree/projects/java
exec bash

16
Điều này tạo ra một subshell mới. Khi bạn nhập, exitbạn sẽ trở về trình bao nơi bạn chạy tập lệnh này.
tripleee

1
Khi tập lệnh được gọi nhiều lần dường như nó tạo ra các shell lồng nhau và tôi cần gõ 'exit' rất nhiều lần. Điều này có thể được giải quyết bằng cách nào đó?
VladSavitsky

Xem các câu trả lời khác: sử dụng bí danh, sử dụng "Pushd / popd / dirs" hoặc sử dụng "nguồn"
qneill

25

Tôi có mã của tôi để làm việc bằng cách sử dụng. <your file name>

./<your file name> Liều không hoạt động vì nó không thay đổi thư mục của bạn trong thiết bị đầu cuối, nó chỉ thay đổi thư mục cụ thể cho tập lệnh đó.

Đây là chương trình của tôi

#!/bin/bash 
echo "Taking you to eclipse's workspace."
cd /Developer/Java/workspace

Đây là thiết bị đầu cuối của tôi

nova:~ Kael$ 
nova:~ Kael$ . workspace.sh
Taking you to eclipe's workspace.
nova:workspace Kael$ 

2
Sự khác biệt giữa . something./something?? Câu trả lời này làm việc cho tôi và tôi không hiểu tại sao.
Dracorat

. somethingcho phép bạn chạy tập lệnh từ bất kỳ vị trí nào, ./somethingyêu cầu bạn phải ở trong thư mục tệp được lưu trữ.
Projjol


Bạn có thể đặt dấu chấm trong dòng shebang? #!. /bin/bash?
Sigfried


12

Khi bạn bắn một tập lệnh shell, nó sẽ chạy một phiên bản mới của shell đó ( /bin/bash). Do đó, tập lệnh của bạn chỉ kích hoạt trình bao, thay đổi thư mục và thoát. Đặt một cách khác, cd(và các lệnh khác như vậy) trong tập lệnh shell không ảnh hưởng cũng như không có quyền truy cập vào trình bao mà chúng được khởi chạy.


11

Trong trường hợp cụ thể của tôi, tôi cần quá nhiều lần để thay đổi cho cùng một thư mục. Vì vậy, trên .bashrc của tôi (tôi sử dụng Ubuntu) tôi đã thêm

1 -

$ nano ~. / bashrc

 function switchp
 {
    cd /home/tree/projects/$1
 }

2-

$ nguồn ~ / .bashrc

3 -

$ chuyển đổi java

Trực tiếp nó sẽ làm: cd / home / cây / dự án / java

Mong rằng sẽ giúp!


1
@WM Cuối cùng, bạn có thể thực hiện "$ switchp" mà không cần bất kỳ tham số nào để truy cập trực tiếp vào cây dự án
vào

2
@workdreamer Cách tiếp cận chức năng mà bạn mô tả ở trên đã giải quyết một rắc rối nhỏ ở đây khi đi vào các thư mục con có cùng thư mục mẹ trong hệ thống của tôi. Cảm ơn bạn.
WM

10

Bạn có thể làm như sau:

#!/bin/bash
cd /your/project/directory
# start another shell and replacing the current
exec /bin/bash

EDIT: Điều này cũng có thể được 'chấm', để ngăn chặn việc tạo ra các vỏ tiếp theo.

Thí dụ:

. ./previous_script  (with or without the first line)

1
Điều đó trở nên khá lộn xộn sau một vài lần chạy .. Bạn sẽ phải exit(hoặc ctrl + d) nhiều lần để thoát khỏi trình bao, ví dụ .. Một bí danh sạch hơn rất nhiều (ngay cả khi lệnh shell xuất ra một thư mục và nó là cd đến đầu ra - bí danh gì đó = "cd getnewdirectory.sh")
dbr

Lưu ý 'người thực hiện'. Nó làm cho thay thế vỏ cũ.
Thevs

2
Trình thực thi chỉ thay thế trình bao phụ đang chạy lệnh cd, không phải trình bao chạy tập lệnh. Nếu bạn chấm đoạn script, thì bạn sẽ đúng.
Jonathan Leffler

Làm cho nó 'chấm' - không có vấn đề. Tôi chỉ đề xuất giải pháp. Nó không phụ thuộc vào cách bạn khởi chạy này.
Thevs

2
Hehe, tôi nghĩ tốt hơn là chỉ nên 'chấm' tập lệnh một dòng chỉ bằng lệnh cd :) Dù sao tôi cũng sẽ giữ câu trả lời của mình ... Đó sẽ là câu trả lời ngu ngốc cho câu hỏi ngu ngốc không chính xác :)
Thevs

7

Nó chỉ thay đổi thư mục cho chính tập lệnh, trong khi thư mục hiện tại của bạn giữ nguyên.

Bạn có thể muốn sử dụng một liên kết tượng trưng thay thế. Nó cho phép bạn tạo một "phím tắt" cho một tập tin hoặc thư mục, vì vậy bạn chỉ phải gõ một cái gì đó như cd my-project.


Có symlink đó trong mọi thư mục sẽ gây phiền toái. Có thể đặt symlink vào $ HOME và sau đó thực hiện 'cd ~ / my-project'. Thành thật mà nói, việc sử dụng CDPATH đơn giản hơn.
Jonathan Leffler

7

Bạn có thể kết hợp bí danh và cách tiếp cận dấu chấm của Adam & Greg để tạo ra thứ gì đó có thể năng động hơn

alias project=". project"

Bây giờ chạy bí danh dự án sẽ thực thi kịch bản dự án trong shell hiện tại trái ngược với subshell.


Đây chính xác là những gì tôi cần để duy trì tất cả tập lệnh của mình và chỉ cần gọi nó từ bash và duy trì phiên hiện tại - đây là câu trả lời HOÀN HẢO.
Matt Ninja

7

Bạn có thể kết hợp bí danh và tập lệnh,

alias proj="cd \`/usr/bin/proj !*\`"

với điều kiện kịch bản lặp lại đường dẫn đích. Lưu ý rằng đó là những backticks xung quanh tên tập lệnh. 

Ví dụ: tập lệnh của bạn có thể là

#!/bin/bash
echo /home/askgelal/projects/java/$1

Ưu điểm của kỹ thuật này là tập lệnh có thể lấy bất kỳ số lượng tham số dòng lệnh nào và phát ra các đích khác nhau được tính bằng logic phức tạp.


3
tại sao? bạn chỉ có thể sử dụng: proj() { cd "/home/user/projects/java/$1"; }=> proj "foo"(hoặc, proj "foo bar"<= trong trường hợp bạn có khoảng trắng) ... hoặc thậm chí (ví dụ): proj() { cd "/home/user/projects/java/$1"; shift; for d; do cd "$d"; done; }=> proj a b c=> thực hiện cdvào/home/user/projects/java/a/b/c
michael


5

Trong tệp ~ / .bash_profile của bạn. thêm chức năng tiếp theo

move_me() {
    cd ~/path/to/dest
}

Khởi động lại thiết bị đầu cuối và bạn có thể gõ

move_me 

và bạn sẽ được chuyển đến thư mục đích.


3

Bạn có thể sử dụng toán tử &&:

cd myDirectory && ls


Downvote: Điều này không cố gắng trả lời câu hỏi thực tế ở đây. Bạn có thể chạy hai lệnh tại dấu nhắc (với &&nếu bạn muốn lệnh thứ hai có điều kiện ở lần đầu tiên hoặc chỉ với ;hoặc dòng mới giữa chúng) nhưng việc đưa lệnh này vào tập lệnh sẽ đưa bạn trở lại "tại sao không sử dụng trình bao cha mẹ thư mục mới khi cdthực sự thành công? "
tripleee

3

Mặc dù tìm nguồn cung cấp tập lệnh mà bạn muốn chạy là một giải pháp, bạn nên lưu ý rằng tập lệnh này sau đó có thể trực tiếp sửa đổi môi trường của trình bao hiện tại của bạn. Ngoài ra, nó không thể vượt qua đối số nữa.

Một cách khác để làm là triển khai tập lệnh của bạn dưới dạng hàm trong bash.

function cdbm() {
  cd whereever_you_want_to_go
  echo "Arguments to the functions were $1, $2, ..."
}

Kỹ thuật này được sử dụng bởi autojump: http://github.com/joelthelion/autojump/wiki để cung cấp cho bạn học dấu trang thư mục shell.


3

Bạn có thể tạo một chức năng như dưới đây trong của bạn .bash_profilevà nó sẽ hoạt động trơn tru.

Hàm sau có một tham số tùy chọn là một dự án. Ví dụ: bạn chỉ có thể chạy

cdproj

hoặc là

cdproj project_name

Đây là định nghĩa hàm.

cdproj(){
    dir=/Users/yourname/projects
    if [ "$1" ]; then
      cd "${dir}/${1}"
    else
      cd "${dir}"
    fi
}

Đừng quên nguồn của bạn .bash_profile


1
câu trả lời tốt hơn nhiều so với bí danh
Pax0r

Giải pháp này là tuyệt vời trong sự đơn giản và linh hoạt của nó.
Kjartan

3

Điều này nên làm những gì bạn muốn. Thay đổi thư mục quan tâm (từ trong tập lệnh), và sau đó sinh ra một bash shell mới.

#!/bin/bash

# saved as mov_dir.sh
cd ~/mt/v3/rt_linux-rt-tools/
bash

Nếu bạn chạy nó, nó sẽ đưa bạn đến thư mục quan tâm và khi bạn thoát nó, nó sẽ đưa bạn trở lại vị trí ban đầu.

root@intel-corei7-64:~# ./mov_dir.sh

root@intel-corei7-64:~/mt/v3/rt_linux-rt-tools# exit
root@intel-corei7-64:~#

Điều này thậm chí sẽ đưa bạn trở lại thư mục gốc của bạn khi bạn thoát ( CTRL+ d)


3
Sinh ra một bash mới sẽ có nghĩa là bạn mất lịch sử và nó sẽ bắt đầu mới.
Tisch

2

LOOOOOng thời gian sau, nhưng tôi đã làm như sau:

tạo một tập tin gọi là trường hợp

dán đoạn sau vào tập tin:

#!/bin/sh

cd /home/"$1"

lưu nó và sau đó:

chmod +x case

Tôi cũng đã tạo một bí danh trong .bashrc:

alias disk='cd /home/; . case'

Bây giờ khi tôi gõ:

case 12345

về cơ bản tôi đang gõ:

cd /home/12345

Bạn có thể nhập bất kỳ thư mục nào sau 'case':

case 12

case 15

case 17

giống như gõ

cd /home/12

cd /home/15

cd /home/17

tương ứng

Trong trường hợp của tôi, con đường dài hơn nhiều - những kẻ này đã tóm tắt nó với thông tin ~ trước đó.


1
Các cdbí danh là thừa và không phù hợp; bí danh chỉ đơn giản là '. ~ / trường hợp thay thế. Cũng caselà một từ khóa dành riêng, vì vậy một lựa chọn khá kém cho một tên.
tripleee

1

Bạn không cần tập lệnh, chỉ đặt tùy chọn chính xác và tạo biến môi trường.

shopt -s cdable_vars

trong của bạn ~/.bashrccho phép cdnội dung của các biến môi trường.

Tạo một biến môi trường như vậy:

export myjava="/home/tree/projects/java"

và bạn có thể sử dụng:

cd myjava

Các lựa chọn thay thế khác .


0

Nếu bạn đang sử dụng làm vỏ của mình, giải pháp tốt nhất là tạo một hàm. Ví dụ, đưa ra câu hỏi ban đầu, bạn có thể sao chép 4 dòng bên dưới và dán chúng vào dòng lệnh cá của bạn:

function proj
   cd /home/tree/projects/java
end
funcsave proj

Điều này sẽ tạo ra chức năng và lưu nó để sử dụng sau. Nếu dự án của bạn thay đổi, chỉ cần lặp lại quá trình sử dụng đường dẫn mới.

Nếu bạn thích, bạn có thể thêm tệp chức năng theo cách thủ công bằng cách thực hiện như sau:

nano ~/.config/fish/functions/proj.fish

và nhập văn bản:

function proj
   cd /home/tree/projects/java
end

và cuối cùng nhấn ctrl + x để thoát và y theo sau là quay lại để lưu các thay đổi của bạn.

( LƯU Ý: phương pháp đầu tiên sử dụng funcsave tạo tệp proj.fish cho bạn ).


0

Tôi có một tập lệnh bash đơn giản được gọi là p để quản lý việc thay đổi thư mục trên
github.com/godzilla/bash- ware
chỉ cần đặt tập lệnh vào thư mục bin cục bộ của bạn (/ usr / local / bin)
và đặt

alias p='. p'

trong .bashrc của bạn


cái này làm gì có vẻ như nó sẽ tự chạy theo cách đệ quy, mặc dù tôi chắc chắn nếu bạn chạy nó trước khi nó không hoạt động;)
Ryan Taylor

0

Lưu ý thảo luận Làm cách nào để đặt thư mục làm việc của quy trình cha?

Nó chứa một số câu trả lời hackish, ví dụ https://stackoverflow.com/a/2375174/755804 (thay đổi thư mục quy trình cha mẹ thông qua gdb, không làm điều này) và https://stackoverflow.com/a/51985735/755804 ( lệnh tailcdtiêm dirname cd vào luồng đầu vào của tiến trình cha mẹ, tốt nhất, lý tưởng là nó phải là một phần của bash chứ không phải là hack)


0

Đây là một câu hỏi cũ, nhưng tôi thực sự ngạc nhiên khi tôi không thấy mẹo này ở đây

Thay vì sử dụng cd, bạn có thể sử dụng

export PWD=the/path/you/want

Không cần phải tạo subshells hoặc sử dụng bí danh.

Lưu ý rằng bạn có trách nhiệm đảm bảo / đường dẫn / bạn / muốn tồn tại.


Thật không may, không may.
ttfreeman

0

Như đã giải thích về các câu trả lời khác, bạn đã thay đổi thư mục, nhưng chỉ trong lớp vỏ phụ chạy tập lệnh . Điều này không ảnh hưởng đến vỏ cha.

Một giải pháp là sử dụng các hàm bash thay vì bash script ( sh); bằng cách đặt mã bash script của bạn vào một hàm. Điều đó làm cho hàm có sẵn dưới dạng một lệnh và sau đó, điều này sẽ được thực thi mà không cần một tiến trình con và do đó, bất kỳ cdlệnh nào sẽ tác động đến trình bao của người gọi.

Hàm Bash:

Một tính năng của cấu hình bash là lưu trữ các chức năng tùy chỉnh có thể chạy trong thiết bị đầu cuối hoặc trong các tập lệnh bash giống như cách bạn chạy ứng dụng / lệnh này cũng có thể được sử dụng làm lối tắt cho các lệnh dài.

Để làm cho chức năng của bạn hoạt động hiệu quả trên hệ thống, bạn sẽ cần sao chép chức năng của mình ở cuối một số tệp

/home/user/.bashrc
/home/user/.bash_profile
/root/.bashrc
/root/.bash_profile

Bạn có thể sudo kwrite /home/user/.bashrc /home/user/.bash_profile /root/.bashrc /root/.bash_profilechỉnh sửa / tạo các tệp đó một cách nhanh chóng

Làm thế nào để :

Sao chép mã tập lệnh bash của bạn bên trong một hàm mới ở cuối tệp hồ sơ của bash và khởi động lại thiết bị đầu cuối của bạn, sau đó bạn có thể chạy cddhoặc bất cứ chức năng nào bạn đã viết.

Ví dụ tập lệnh

Tạo lối tắt đến cd ..vớicdd

cdd() {
  cd ..
}

phím tắt ls

ll() {
  ls -l -h
}

phím tắt ls

lll() {
  ls -l -h -a
}

-2

Bạn có thể thực thi một số dòng trong cùng một khung con nếu bạn kết thúc các dòng bằng dấu gạch chéo ngược.

cd somedir; \
pwd
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.