2010-10-30 27 views

Trả lời

171

Bí danh sẽ mở rộng thành chuỗi mà nó đại diện. Bất kỳ điều gì sau bí danh sẽ xuất hiện sau khi mở rộng mà không cần hoặc có thể được chuyển thành các đối số rõ ràng (ví dụ: $1).

$ alias foo='/path/to/bar' 
$ foo some args 

sẽ được mở rộng để

$ /path/to/bar some args 

Nếu bạn muốn sử dụng lập luận rõ ràng, bạn sẽ cần phải sử dụng một hàm

$ foo() { /path/to/bar "[email protected]" fixed args; } 
$ foo abc 123 

sẽ được thực hiện như là nếu bạn đã làm

$ /path/to/bar abc 123 fixed args 

Để xác định bí danh:

unalias foo 

Để undefine một hàm:

unset -f foo 

Để xem các loại và định nghĩa (đối với từng bí danh được xác định, từ khóa, chức năng, tập tin được xây dựng trong hoặc thực thi):

type -a foo 

Hoặc chỉ nhập (để có mức độ ưu tiên cao nhất):

type -t foo 
+7

Chỉ muốn thêm ví dụ từ .bashrc mkcd() {mkdir "$ @" && cd "$ @"; } nơi tôi đang tạo thư mục và cd'ing thành –

+0

Bạn cũng nên tô màu "abc" đỏ vì $ @ = danh sách các đối số được truyền cho hàm. – 10basetom

+3

@ 10basetom: Nếu bạn đang đề cập đến các màu sắc trong câu trả lời của tôi, điều đó được thực hiện tự động bởi highlighter cú pháp. –

16

Thông thường khi tôi muốn chuyển đối số cho một bí danh trong Bash, tôi sử dụng kết hợp bí danh và một hàm như thế này, ví dụ:

function __t2d {                 
     if [ "$1x" != 'x' ]; then            
      date -d "@$1"              
     fi                  
} 

alias t2d='__t2d'                
+1

Tuyên bố 'if' luôn luôn là gì? –

+0

đã được sửa. Đó là một lỗi đánh máy, xin lỗi. nó thực sự có nghĩa là để kiểm tra sự tồn tại của $ 1 – leed25d

+16

'[-n" $ 1 "]' (việc sử dụng "x" theo cách đó là cổ xưa và không cần thiết cho bất kỳ vỏ hiện đại nào) –

-3

Để đơn giản hóa câu trả lời của leed25d, hãy sử dụng kết hợp bí danh và hàm. Ví dụ:

function __GetIt { 
    cp ./path/to/stuff/$* . 
} 

alias GetIt='__GetIt' 
14

sử dụng các thông số trong các bí danh, tôi sử dụng phương pháp này:

alias myalias='function __myalias() { echo "Hello $*"; unset -f __myalias; }; __myalias' 

nó một chức năng tự hủy hoại bọc trong một bí danh, vì vậy nó khá nhiều là tốt nhất của cả hai thế giới, và không mất thêm một dòng (s) trong định nghĩa của bạn ... mà tôi ghét, oh yeah và nếu bạn cần giá trị trả lại đó, bạn sẽ phải lưu trữ nó trước khi gọi unset, và sau đó trả về giá trị bằng cách sử dụng "return "từ khóa trong chức năng tự phá hoại đó:

alias myalias='function __myalias() { echo "Hello $*"; myresult=$?; unset -f __myalias; return $myresult; }; __myalias' 

vì vậy ..

bạn có thể, nếu bạn cần phải có biến mà trong đó

alias mongodb='function __mongodb() { ./path/to/mongodb/$1; unset -f __mongodb; }; __mongodb' 

tất nhiên ...

alias mongodb='./path/to/mongodb/' 

sẽ thực sự làm điều tương tự mà không cần thông số, nhưng như tôi đã nói, nếu bạn muốn hoặc cần họ vì một lý do nào (ví dụ, bạn cần $ 2 thay vì $ 1), bạn sẽ cần phải sử dụng một wrapper như thế. Nếu nó lớn hơn một dòng, bạn có thể xem xét việc chỉ viết một hàm hoàn toàn vì nó sẽ trở thành một phần của mắt khi nó lớn hơn. Chức năng là rất tốt vì bạn nhận được tất cả các đặc quyền mà chức năng cung cấp (xem hoàn thành, bẫy, ràng buộc, vv cho các tính năng mà các chức năng có thể cung cấp, trong manpage bash).

Tôi hy vọng rằng sẽ giúp bạn ra ngoài :)

+2

~ $ alias myalias = 'function __myalias() {echo "Xin chào $ *"; unset -f __myalias; } __myalias ' ~ $ myalias -bash: lỗi cú pháp gần mã thông báo không mong muốn '__myalias' – JeeBee

+0

Điều này thật khủng khiếp! bạn đang xác định lại chức năng mỗi lần? (Tôi thậm chí không thể kiểm tra nếu bạn có lỗi cú pháp ở đó). –

+0

Nó không giống như họ phải làm điều đó CHÍNH XÁC theo cách đó, nó được cho là một ví dụ, và có nó được định nghĩa lại mỗi lần, giữ nó ở một dòng, nếu không, nó sẽ không phải là một shot nó sẽ ? Điều đó giống như phàn nàn rằng "bí danh" mở rộng chính nó đến nội dung được chỉ định mỗi lần, điều này khác gì? Và không cần phải quá xúc động. – osirisgothra

3

Trong csh (như trái ngược với bash), bạn có thể thực hiện chính xác những gì bạn muốn.

alias print 'lpr \!^ -Pps5' 
print memo.txt 

Ký hiệu \!^ làm cho đối số được chèn vào lệnh tại thời điểm này.

Ký tự ! được preceeded bởi \ để ngăn nó được hiểu là lệnh lịch sử.

Bạn cũng có thể vượt qua nhiều đối số:

alias print 'lpr \!* -Pps5' 
print part1.ps glossary.ps figure.ps 

(ví dụ lấy từ http://unixhelp.ed.ac.uk/shell/alias_csh2.1.html.)

+0

Cảm ơn! Tôi sử dụng 'csh' tại nơi làm việc và đây là lần đầu tiên tôi đánh giá cao nó! –

5

Đây là giải pháp mà có thể tránh sử dụng chức năng:

alias addone='{ num=$(cat -); echo "input: $num"; echo "result:$(($num+1))"; }<<<' 

kết quả xét nghiệm

addone 200 
input: 200 
result:201 
+0

Nó hoạt động hoàn hảo cho tôi. Tôi muốn chuyển số màu (từ 31 đến 37) cho lệnh PS trong bí danh của tôi. Tôi đã làm một cái gì đó như thế này: bí danh psany = '{PS1 = "\ e [0; $ (cat -) m> \ e [m";} <<<' SỬ DỤNG: psany 32 – zviad

Các vấn đề liên quan