Có thể xác định một lệnh trong bash?


25

Ví dụ: tôi có thể đặt:

gb = cd /media/Dan/evolution

... để mỗi lần tôi thực hiện gbtrong bash, tôi có thể cdvào thư mục cụ thể đó không?

Tôi tìm thấy một cái gì đó trực tuyến: aliaslệnh. Nhưng có vẻ như nó không thể làm công việc trên.

Có thể làm việc đó không? Làm sao?


10
alias gb='cd /media/Dan/evolution'
Nykakin

4
@Zen, vui lòng chấp nhận câu trả lời nếu nó giải quyết được vấn đề. Đây là một cử chỉ nói lời cảm ơn đến người dùng đã giúp bạn giải quyết vấn đề này :)
Ramesh

2
Lưu ý: Đây là về bash: Linux là kernel. Linux thường, không chính xác, được sử dụng để chỉ toàn bộ hệ điều hành. Điều này có thể dẫn đến sự nhầm lẫn. Ví dụ, câu hỏi mà tôi có thể làm như vậy và điều đó trong Linux không? Nếu bạn có thể làm điều đó trên một số máy tính thì có. Bởi vì bạn có thể thực hiện bất kỳ hệ điều hành nào bạn muốn bằng hạt nhân Linux. Vì vậy, chúng tôi cần biết cái nào, bạn đang sử dụng Ubuntu Gnu + Linux + có thể là X11 (nếu trên máy tính để bàn tức là không phải máy chủ không có màn hình).
ctrl-alt-delor

@richard Điểm tốt, mặc dù về mặt kỹ thuật đây là posixkhiếu nại, vì vậy không chỉ bash.

1
@richard Thật vậy, đó là vấn đề. Nó hoạt động vì mọi người không có nghĩa là Android và những hương vị như vậy, ít nhiều. Tôi không nói đó là một điều tốt, nhưng đó là những gì nó được. Giới thiệu của tôi đã được ngầm định kể từ khi tôi nhận xét về tuyên bố linux của bạn. Tôi chỉ làm cho mình rõ ràng vì chủ đề là thuật ngữ khó hiểu. (Tôi có thể đã hiểu nhầm bình luận cuối cùng của bạn)
keyer

Câu trả lời:


50

chỉ loại:

alias gb='cd /media/Dan/evolution'

Để đặt cài đặt này vĩnh viễn (để nó dính sau khi bạn khởi động lại hoặc mở bảng điều khiển khác), hãy thêm dòng này vào tệp ~ / .bashrc (giả sử bạn sử dụng bash làm vỏ mặc định của mình)


Để làm cho nó thậm chí còn đẹp hơn, bạn có thể tạo một tệp bí danh chuyên dụng cho các aliass của mình, giả sử ~ / .bash_aliases và gọi nó từ trong tệp ~ / .bashrc của bạn như thế này: [-e ~ / .bash_aliases] &&. ~ / .bash_aliases Bằng cách này, bạn không "làm ô nhiễm" tệp ~ / .bashrc với những thứ khác.
GeertVc

39

Thay thế cho răng cưa

gb() { cd /media/Dan/evolution; }

Điều này xác định hàm shell gb, không có đối số và thực hiện cd / media / Dan / Evolution. Cũng như các gợi ý khác, điều này có thể được thêm vào ~ / .bashrc


Với nhược điểm là lệnh bí danh hiển thị bí danh đã xác định, afaik xác định hàm như vậy có thể dẫn đến "hành vi không mong muốn". Tôi sẽ bỏ phiếu cho bạn vì sự hoàn hảo :)
vfbsilva

7
Không hẳn vậy. Bạn chỉ có thể gõ: khai báo -f gb để xem những gì nó làm
Paul Calabro

11
Ngoài ra, tùy chọn này linh hoạt hơn ở chỗ nó cho phép bạn thêm logic tùy chỉnh của mình trong định nghĩa hàm để chấp nhận đối số và làm bất cứ điều gì bạn cần. Bí danh chỉ cho phép truyền đối số và thực hiện các hành động được xác định trước .
Paul Calabro

5
@PaulCalabro Thậm chí tốt hơn, type gbsẽ hoạt động nếu đó là bí danh hoặc chức năng.
Sparhawk

VỊ TRÍ: { echo 'true() { : ; }' >./script ; . ./script ; command -V true ; command -V /usr/bin/true ; }-true is a shell function\n/usr/bin/true is /usr/bin/true - các \nký tự là dòng mới theo nghĩa đen trong đầu ra.
mikeerv

11

Có thể, và đó aliaslà lệnh bạn đang tìm kiếm. Ví dụ alias ll="ls -l"trong bash sẽ cho phép bạn gõ llthay vì ls -l. Xin lưu ý rằng không có khoảng trắng được sử dụng khi đặt bí danh. man aliascũng có thể hữu ích


-3

Ngoài ra, có thể viết chương trình C gọi lệnh mong muốn và lưu nó vào / usr / bin.

#include <stdio.h>
#include <string.h>

int main () {
    char command[50]; //notice you can change this to fit your needs
    int return_val;

    strcpy( command, "echo \"cd /media/Dan/evolution\" | bash -i" );
    return_val = system(command); 

   //this is equivalent to entering the command in a new bash, 
   //which will return and exit

    return return_val;
}

Để biên dịch nó, hãy chuyển đến thư mục lưu nguồn (trong bash) và thực thi (bạn có thể cần sudo):

 gcc ./gb.c -o /usr/bin/gb

Sau khi nghiên cứu sâu hơn ở đây , tôi nhận ra rằng chỉ cần ném lệnh của bạn vào system()sẽ không hoạt động đối với bash được xây dựng trong các lệnh. Đó là lý do tại sao bạn cần tạo một thể hiện của một bash tương tác và lặp lại các lệnh của bạn với nó. Nó quá phức tạp và có thể vô dụng, trừ khi bạn muốn, giả sử, rút ​​ngắn cuộc gọi đến một kịch bản shell (some_script thay vì sh ~/radgeRayden/Scripts/some_script).

Tham chiếu cho hàm system ()


2
Bạn đã thực sự thử điều này? Nó không hoạt động.
Dennis

1
Vì lý do tương tự mà sh -c "cd /media/Dan/evolution"không làm việc. Gợi ý: subshell
Chấn thương kỹ thuật số

5
cd/ subshell vấn đề sang một bên, lợi thế trong việc gói một lệnh shell trong chương trình c là gì, khi bạn có thể dễ dàng (hoặc dễ dàng hơn) đặt lệnh đó trong một tập lệnh shell?
Chấn thương kỹ thuật số

1
Không phải là một chuyên gia về điều này, nhưng không nên đặt một cái gì đó như thế này (hy vọng, một cái gì đó hữu ích hơn) được đặt trong / usr / local / bin?
Joe

2
Ngay cả khi COULD này hoạt động, nó cũng không nên đi vào / usr / local / bin vì nó dành riêng cho một người dùng.
Johan
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.