Làm cách nào để chạy tập lệnh shell mà không sử dụng các lệnh của sh shem hay


261

Tôi có một kịch bản shell mà tôi muốn chạy mà không cần sử dụng các lệnh "sh" hoặc "bash". Ví dụ:

Thay vì: sh script.sh

Tôi muốn sử dụng: script.sh

Tôi có thể làm cái này như thế nào?

PS (i) Tôi không sử dụng shell script nhiều và tôi đã thử đọc về bí danh, nhưng tôi không hiểu cách sử dụng chúng.

(ii) Tôi cũng đọc về việc liên kết tập lệnh với một tệp khác trong các biến PATH. Tôi đang sử dụng máy chủ trường đại học của mình và tôi không có quyền tạo tệp ở những vị trí đó.


1
Các câu trả lời chỉ ra cách làm cho tập lệnh có thể thực thi được, nhưng dường như không đề cập đến cách làm cho tập lệnh có thể truy cập được. Vì thế, hãy tạo cho mình một thư mục bin - $HOME/bin- nếu bạn chưa có, hãy thêm nó vào PATH của bạn (gần phía trước). Đặt các tập lệnh (và bất kỳ chương trình nào khác) mà bạn muốn thực thi trực tiếp mà không chỉ định tên đường dẫn ở đây hoặc liên kết tượng trưng ở đây để đặt các chương trình thực tế.
Jonathan Leffler

1
Sau khi bạn làm theo (các) câu trả lời bên dưới, để bỏ ".sh", bạn có thể đổi tên tệp: mv example.sh examplevà sau đó examplesẽ tự hoạt động.
PJ Brunet

Câu trả lời:


434

Thêm một "shebang" ở đầu tệp của bạn:

#!/bin/bash

Và làm cho tập tin của bạn thực thi ( chmod +x script.sh).

Cuối cùng, sửa đổi đường dẫn của bạn để thêm thư mục chứa tập lệnh của bạn:

export PATH=$PATH:/appropriate/directory

(thông thường, bạn muốn $HOME/binlưu trữ tập lệnh của riêng bạn)


Này, cám ơn bạn đã trả lời. Tôi đã thử nó ra. Bây giờ tôi có thể chạy nó mà không cần lệnh "sh". Nhưng tôi vẫn phải thêm tiền tố vào lệnh "./" mà tôi không muốn. :)
Rameez Hussain

5
Xem bình luận về con đường. Bạn cần đặt tập lệnh của mình vào một thư mục mà bạn phải nối vào PATH của mình.
fge

2
nó không hoạt động trong trường hợp của tôi. nhưng source script.shhoạt động tốt, hay đúng hơn source <filename_without_any_extension_type>
MycrofD 22/03/2017

4
source ./my-cool-script(hoặc . ./my-cool-script) sẽ gây ô nhiễm phiên shell hiện tại với bất kỳ biến nào được xác định trong tập lệnh. Không nên sử dụng nguồn trừ khi bạn muốn sửa đổi rõ ràng phiên shell bằng cách đặt vars môi trường, thay đổi thư mục, v.v.
Daniel Waltrip

3
Nếu bạn chắc chắn thư mục script nằm trong PATH và nó vẫn không hoạt động mà không có ./, thì bạn có thể bị xung đột tên. Hãy thử đổi tên.
điệp khúc

66

Đây là một số điều kiện tiên quyết của việc sử dụng trực tiếp tên tập lệnh:

  1. Thêm she-bang (#!/bin/bash)dòng ở trên cùng.
  2. Sử dụng chmod u+x scriptname làm cho tập lệnh thực thi. ( scriptnametên tập lệnh của bạn ở đâu)
  3. Đặt tập lệnh dưới /usr/local/binthư mục.
  4. Chạy tập lệnh chỉ sử dụng tên của tập lệnh.

Lưu ý: Lý do tôi đề nghị đặt nó bên dưới/usr/local/bin thư mục là vì rất có thể đó sẽ là đường dẫn đã được thêm vào của bạn PATH variable.

Cập nhật:

Nếu bạn không có quyền truy cập vào /usr/local/bin thư mục thì hãy làm như sau:

  1. Tạo một thư mục trong thư mục nhà của bạn và hãy gọi nó myscripts .
  2. Làm ls -larttrên thư mục nhà của bạn, để xác định tập lệnh khởi động mà shell của bạn đang sử dụng. Nó nên .profilehoặc.bashrc .
  3. Khi bạn đã xác định tập lệnh khởi động, hãy thêm dòng sau vào tập lệnh của bạn - export set PATH=$PATH:~/myscript .
  4. Sau khi thêm, nguồn kịch bản khởi động của bạn hoặc đăng xuất và đăng nhập lại.
  5. Thực thi kịch bản của bạn bằng cách sử dụng scriptname.

Tôi đã thử làm điều này nhưng tôi không có quyền truy cập vào thư mục / usr / local / bin. Tôi đang sử dụng máy tính của trường đại học.
Rameez Hussain

1
Bạn có thể vui lòng cho tôi biết ý của bạn là "nguồn kịch bản khởi nghiệp của bạn" không?
Rameez Hussain

1
Tìm kiếm tập lệnh khởi động có nghĩa là thực thi nó để tham số mới được đặt thành biến PATH được chọn bởi shell. Điều này có thể được thực hiện bằng cách làm . .bashrc. Đó là, chỉ cần đặt .theo sau spacevà sau đó là tên tập lệnh khởi động của bạn.
jaypal singh

Tôi không biết vấn đề với hệ thống là gì. Tôi đã tạo một tập lệnh shell mới có tên "hello" chỉ với một "echo" hello "" trong đó. Tôi đã thay đổi quyền của nó và đã thử ./hello. Nó không hoạt động. nó nói-
Rameez Hussain

Những thay đổi bạn đã thực hiện cho các kịch bản khởi động của bạn?
jaypal singh

20

Chỉ cần chắc chắn rằng nó là thực thi, sử dụng chmod +x. Theo mặc định, thư mục hiện tại không có trên PATH của bạn, vì vậy bạn sẽ cần phải thực thi nó dưới dạng ./script.sh- hoặc nếu không thì tham chiếu nó theo một đường dẫn đủ điều kiện. Ngoài ra, nếu bạn thực sự cần chỉ script.sh, bạn sẽ cần thêm nó vào ĐƯỜNG của bạn. (Bạn có thể không có quyền truy cập để sửa đổi đường dẫn hệ thống, nhưng bạn gần như chắc chắn có thể sửa đổi PATH của môi trường hiện tại của chính mình.) Điều này cũng giả sử rằng tập lệnh của bạn bắt đầu bằng một cái gì đó như#!/bin/sh .

Bạn vẫn có thể sử dụng một bí danh, không thực sự liên quan đến kịch bản shell mà chỉ là shell và đơn giản như:

alias script.sh='sh script.sh'

Điều này sẽ cho phép bạn sử dụng chỉ đơn giản script.sh(theo nghĩa đen - điều này sẽ không hoạt động cho bất kỳ *.shtệp nào khác ) thay vì sh script.sh.


Chào! Cảm ơn vì đã trả lời. Tôi đã thử sử dụng bí danh trước đó. Nhưng không có gì xảy ra. Tôi đã đặt nó ngay sau dòng "#! / Usr / local / bin / bash". Bạn nghĩ gì là sai?
Rameez Hussain

1
Một bí danh không thể được định nghĩa trong tập lệnh của bạn - nó phải được khai báo như một phần của môi trường hiện tại của bạn. Vì vậy, chỉ cần chạy aliaslệnh tại dấu nhắc shell, và sau đó bí danh sẽ có sẵn để chạy lệnh với.
ziesemer

17

Trong ví dụ này, tập tin sẽ được gọi myShell

Trước hết chúng ta sẽ cần tạo tập tin này, chúng ta có thể bắt đầu bằng cách gõ như sau:

sudo nano myShell

Thông báo chúng tôi đã không đặt .shphần mở rộng? Đó là bởi vì khi chúng tôi chạy nó từ thiết bị đầu cuối, chúng tôi sẽ chỉ cần gõ myShellđể chạy lệnh của chúng tôi!

Bây giờ, trong nano, dòng trên cùng PHẢI #!/bin/bashsau đó bạn có thể rời một dòng mới trước khi tiếp tục.

Để trình diễn, tôi sẽ thêm một Hello World!phản hồi cơ bản

Vì vậy, tôi gõ như sau:

echo Hello World!

Sau đó, ví dụ của tôi sẽ như thế này:

#!/bin/bash
echo Hello World!

Bây giờ lưu tệp và sau đó chạy lệnh này:

sudo chmod +x myShell

Bây giờ chúng tôi đã làm cho tập tin thực thi, chúng tôi có thể di chuyển nó đến /usr/bin/bằng cách sử dụng lệnh sau:

sudo cp myShell /usr/bin/

Để đảm bảo rằng máy có thể thực thi đúng cách, chúng ta sẽ cần khởi động lại máy

Tôi đã sử dụng sudo shutdown -r now

Chúc mừng! Lệnh của chúng tôi đã hoàn tất! Trong terminal chúng ta có thể gõ myShellvà nó sẽ nóiHello World!


1
Bạn không nên đặt các tệp của riêng mình vào /usr/bin- nhiều hệ thống /usr/local/bindành cho mục đích này và dành /usr/binriêng cho HĐH.
tripleee

Không cần sudo chmodtập tin của riêng bạn.
tripleee

Không cần phải khởi động lại máy. Nhiều nhất bạn nên lấy lại nguồn
Luca Di Liello 6/12/19

14

Bạn phải kích hoạt bit thực thi cho chương trình.

chmod +x script.sh

Sau đó, bạn có thể sử dụng ./script.sh

Bạn có thể thêm thư mục vào PATH trong .bashrctệp của mình (nằm trong thư mục chính của bạn). Thêm dòng này vào cuối tập tin:

export PATH=$PATH:/your/folder/here

Tôi quên đề cập rằng tôi đã thiết lập quyền. Tôi đã sử dụng lệnh "chmod 755 script.sh"
Rameez Hussain

6

Bạn có thể nhập sudo install (tên của tập lệnh) / usr / local / bin / (những gì bạn muốn nhập để thực thi tập lệnh đã nói)

Ví dụ: sudo install quickcommit.sh /usr/local/bin/quickcommit nhập mật khẩu

bây giờ có thể chạy mà không cần .sh và trong bất kỳ thư mục nào


3

Thêm vào . (thư mục hiện tại) để biến PATH của bạn.
Bạn có thể làm điều này bằng cách chỉnh sửa tệp .profile của bạn.
đặt dòng sau vào tệp .profile của bạn
PATH=$PATH:.

Chỉ cần đảm bảo thêm dòng Shebang ( #!/bin/bash) ở đầu tập lệnh của bạn và làm cho tập lệnh có thể thực thi được (sử dụng chmod +x <File Name>).


0

Đây là kịch bản sao lưu của tôi sẽ cung cấp cho bạn ý tưởng và tự động hóa:

Máy chủ: Ubuntu 16.04 PHP: 7.0 Apache2, Mysql, v.v ...

# Make Shell Backup Script - Bash Backup Script
    nano /home/user/bash/backupscript.sh
        #!/bin/bash
        # Backup All Start
        mkdir /home/user/backup/$(date +"%Y-%m-%d")
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_rest.zip /etc -x "*apache2*" -x "*php*" -x "*mysql*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_apache2.zip /etc/apache2
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_php.zip /etc/php
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/etc_mysql.zip /etc/mysql
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_rest.zip /var/www -x "*html*"
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/var_www_html.zip /var/www/html
        sudo zip -ry /home/user/backup/$(date +"%Y-%m-%d")/home_user.zip /home/user -x "*backup*"
        # Backup All End
        echo "Backup Completed Successfully!"
        echo "Location: /home/user/backup/$(date +"%Y-%m-%d")"

    chmod +x /home/user/bash/backupscript.sh
    sudo ln -s /home/user/bash/backupscript.sh /usr/bin/backupscript

thay đổi / home / user vào thư mục người dùng của bạn và gõ: backupscript ở bất cứ đâu trên terminal để chạy script! (giả sử rằng / usr / bin nằm trong đường dẫn của bạn)


0

Nhập "#!/bin/sh"trước tập lệnh. Sau đó lưu nó làm script.shví dụ. sao chép nó vào $HOME/bin hoặc $HOME/usr/bin
Thư mục có thể khác nhau trên các distro linux khác nhau nhưng chúng kết thúc bằng 'bin' và nằm trong thư mục chính cd $HOME/bin hoặc $HOME/usr/bin
Type chmod 700 script.sh
Và bạn có thể chạy nó chỉ bằng cách gõ run.sh trên terminal. Nếu nó không hoạt động, hãy thử chmod +x run.sh thay vì chmod 700 run.sh


Các phần của câu trả lời này không phục hồi thông tin từ các câu trả lời hiện có rất cũ bị nhầm lẫn.
tripleee 31/03/19

0

Tạo bất kỳ tệp nào dưới dạng thực thi


Giả sử bạn có một tệp thực thi có tên là Migrate_linux_amd64 và bạn muốn chạy tệp này dưới dạng một lệnh như "di chuyển"

  1. Đầu tiên kiểm tra tệp thực thi từ vị trí tệp:
[oracle@localhost]$ ./migrate.linux-amd64 
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version
  1. Hãy chắc chắn rằng bạn đã thực thi các đặc quyền trên tệp
    -rwxr-xr-x 1 oracle oinstall 7473971 May 18 2017 migrate.linux-amd64
    nếu không, hãy chạychmod +x migrate.linux-amd64

  2. Sau đó sao chép tập tin của bạn vào /usr/local/bin. Thư mục này được sở hữu bởi root, sử dụng sudo hoặc chuyển sang root và thực hiện các thao tác sau

sudo cp migrate.linux-amd64 /usr/local/bin
sudo chown oracle:oracle /user/local/bin/migrate.linux.amd64
  1. Sau đó tạo một liên kết tượng trưng như dưới đây
sudo ln /usr/local/bin/migrate.linux.amd64 /usr/local/bin/migrate
sudo chown oracle:oracle /usr/local/bin/migrate
  1. Cuối cùng thêm / usr / local / bin vào đường dẫn hoặc hồ sơ người dùng của bạn
export PATH = $PATH:/usr/local/bin
  1. Sau đó chạy lệnh là "di chuyển"
[oracle@localhost]$ migrate
Usage: migrate OPTIONS COMMAND [arg...]
       migrate [ -version | -help ]

Options:
  -source          Location of the migrations (driver://url)
  -path            Shorthand for -source=file://path 
  -database        Run migrations against this database (driver://url)
  -prefetch N      Number of migrations to load in advance before executing (default 10)
  -lock-timeout N  Allow N seconds to acquire database lock (default 15)
  -verbose         Print verbose logging
  -version         Print version
  -help            Print usage

Commands:
  goto V       Migrate to version V
  up [N]       Apply all or N up migrations
  down [N]     Apply all or N down migrations
  drop         Drop everyting inside database
  force V      Set version V but don't run migration (ignores dirty state)
  version      Print current migration version

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.