2010-06-08 35 views
22

Tôi đã tự hỏi liệu có thể tạo một "liên kết" trong usr/bin (tức là) dẫn đến một shell-script hay không.thực thi kịch bản lệnh shell mà không gọi sh ngầm rõ ràng

Nhưng tôi muốn chỉ để viết

% shellscript 

thay vì

% sh shellscript.sh 

kinda giống như một bí danh.

Điều này có khả thi không?

+0

nhớ dòng shebang là dòng đầu tiên của tập lệnh để làm việc này –

+3

Có phải mọi người đều đặt tên cho tập lệnh shell của chúng .sh? I * không bao giờ * sử dụng phần mở rộng '.sh' trên các tập lệnh, vì vậy tôi luôn gõ 'shellscript' –

+0

@Stephen P - Tôi có xu hướng đặt tên là .sh (hoặc .bash) nếu chúng nhỏ một chút mà tôi ' m chỉ cần một vài lần và chạy từ thư mục nhà của tôi, nhưng thả phần mở rộng nếu tôi sẽ di chuyển chúng vào một thư mục bin và chia sẻ chúng với người dùng khác hoặc sử dụng chúng rất nhiều. – rjmunro

Trả lời

43

Hãy dòng đầu tiên của kịch bản

#!/bin/sh 

Sau đó, làm cho nó thực thi bằng cách gõ lệnh:

chmod +x shellscript.sh 

Nếu bây giờ bạn đặt kịch bản trong một thư mục bin đó là trên hệ thống của bạn của PATH biến và bạn sẽ có thể chạy trực tiếp. Để xem các thư mục trong đường dẫn, gõ của bạn:

echo $PATH 

Tôi thường sử dụng /home/[my username]/bin cho các kịch bản mà tôi đã viết để họ không ảnh hưởng đến những người dùng khác trên hệ thống. Nếu tôi muốn họ dành cho tất cả người dùng, tôi sử dụng /usr/local/bin được cung cấp trống trên hầu hết các bản phân phối.

.sh ở cuối tên tệp của tập lệnh chỉ là một quy ước để giúp bạn nhớ loại tệp đó là gì. Nó sẽ vẫn hoạt động nếu bạn đổi tên nó thành chỉ shellscript, ví dụ, sẽ hoàn thành các yêu cầu của bạn.

+0

Cảm ơn mô tả chi tiết của bạn – ShoX

16

Bạn có thể làm cho tập lệnh shell thực thi (chmod +x shellscript.sh). Sau đó, bạn có thể liên kết đến nó từ/usr/bin (ln -s shellscript.sh /usr/bin/shellscript).

+6

+1 để thực sự nêu rõ cách tạo liên kết 'ln -s script .sh/usr/bin/script' –

2

Có. Bạn có thể sử dụng ln để tạo liên kết đến shellscript.sh có tên shellscript. Sau đó, bạn sẽ cần phải làm cho nó thực thi, nhưng sau đó (giả sử /usr/bin là trên đường dẫn của bạn), bạn có thể chạy nó với shellscript.

+0

cảm ơn vì đã giải thích liên kết thay thế! – ShoX

2

Ngoài việc kịch bản thực thi và kết nối nó vào/usr/bin, như những người khác đã gợi ý, bạn cũng sẽ muốn thêm "công việc" đường lên đỉnh của kịch bản:

#!/bin/sh 

# your commands here 

Điều này cho phép bạn chỉ định trình thông dịch shell nào (bash, bourne shell, c-shell, perl, python ...) nên được sử dụng để thực thi tập lệnh của bạn.

-1

Tôi đã suy nghĩ về câu hỏi này khi sử dụng đuôi tên tệp trong Unix/MacOSX và câu trả lời tốt nhất tôi có thể cung cấp là dán từ nhận xét phát triển của mình trong một số mã tôi đã viết cách đây nhiều năm để tự động hóa toàn bộ quá trình cập nhật tập lệnh. vào/usr/local/bin.

I have begun to 
change how I develop code for my contributions to 
/usr/local/bin. In the past I would always leave the development 
file without an extension and depend on the shebang 
#!/usr/bin/env ...) line. The flaw with using this approach 
exclusively is it does not allow me to utilize the code colorizing 
capabilities I have available for programming languages as deftly 
as I might. Also allot of development environments do not 
understand shebang and so see the code as plain text. Nor are the 
contents of files without file extensions accessible via the MacOSX 
QuickLook feature... 

Nói tóm lại, mã tự động hóa của tôi (chứ không phải để nhiều để trả lời ở đây) 'sudo' chèn một bản sao mở rộng-less thực thi của chương trình trong/usr/local/bin nhưng các tập tin trong thư mục phát triển giữ nó mở rộng ngôn ngữ script/chương trình tại chỗ. Cả hai bản sao đều có cùng một dòng shebang ở đầu tệp.Vô số nhiệm vụ lặp đi lặp lại khác cũng được tự động hóa trong mã tự động hóa này. Nhưng phần thưởng cuối cùng là 'overhead' liên quan đến quá trình viết 'lệnh' mới hoặc tinh chỉnh lệnh hiện tại/usr/local/bin 'chỉ cần một vài lần nhấn phím.

Tôi vẫn ở trên Snow Leopard và vẫn cảnh giác với Lion. Vì vậy, nếu mọi thứ khác nhau trên Lion tôi xin lỗi vì bất kỳ sự nhầm lẫn nào. Ngoài ra nếu hệ điều hành của bạn không có tương đương với QuickLook một số những gì tôi đã nói có thể bị mất vào bạn nhưng tôi nghĩ rằng bất kỳ người dùng Linux/Unix vẫn có thể hưởng lợi từ mã hóa màu sắc thông qua vim/less (http: // www- lệnh zeuthen.desy.de/~friebel/unix/less/README).

Một ví dụ về một số lượng mã boilerplate colorizing tự động của tôi tạo điều kiện cho QuickLooking qua mã trong thư mục phát triển:

/usr/bin/highlight --syntax sh --style neon -i "/Users/pcs/Projects /Shell/Bash/findpdftext/findpdftext.sh" >| "/Users/pcs/Projects/Shell /Bash/findpdftext/findpdftext.sh.html" 

Tạo soạn sẵn html này chi phí cho tôi không có gì và đẹp hơn trong QuickLook hơn các trang người đàn ông đó là cũng được tạo tự động. Một ví dụ nhỏ khác về đầu ra tự động đi vào tập lệnh trong thư mục phát triển của chương trình sẽ chạy khi tôi sẵn sàng cam kết bất kỳ thay đổi nào đối với kịch bản được đề cập đến bản sao 'lệnh' trong/usr/local/bin:

##################################### REWIRE findpdftext.sh: 
chmod 777 "/Users/pcs/Projects/Shell/Bash/findpdftext/findpdftext.sh" 
cp -f "findpdftext.sh" "findpdftext" 
sudo ln -f "findpdftext" /usr/local/bin 
cp -f "findpdftext" "/Users/pcs/man/cat1/findpdftext.1" 

############### SYMBOLIC-LINK-NAMES supplied from command-line: 
##### fpdf is a symbolic link to findpdftext 
sudo ln -s -f "/usr/local/bin/findpdftext" "/usr/local/bin/fpdf" 
cp -f "/usr/local/bin/findpdftext" "/Users/pcs/man/cat1/fpdf.1" 

############### SYMBOLIC-LINK-NAMES supplied from command-line: 
##### fpt is a symbolic link to findpdftext 
sudo ln -s -f "/usr/local/bin/findpdftext" "/usr/local/bin/fpt" 
cp -f "/usr/local/bin/findpdftext" "/Users/pcs/man/cat1/fpt.1" 

Tóm lại, đối với tôi, có nhiều lý do để sử dụng cả hai kiểu đặt tên tệp.

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