Як запустити скрипт оболонки, не використовуючи команди "sh" або "bash"?


261

У мене є сценарій оболонки, який я хочу запустити, не використовуючи команди "sh" або "bash". Наприклад:

Замість: sh script.sh

Я хочу використовувати: script.sh

Як я можу це зробити?

PS (i) Я мало використовую скрипт оболонки, і я спробував прочитати про псевдоніми, але не зрозумів, як ними користуватися.

(ii) Я також читав про зв'язування сценарію з іншим файлом у змінних PATH. Я використовую свій університетський сервер і не маю дозволів на створення файлу в цих місцях.


1
Відповіді вказують, як зробити сценарій виконуваним, але, здається, не пояснюють, як зробити його доступним. Для цього створіть собі каталог бін - $HOME/bin- якщо у вас його ще немає, додайте його у свій ПАТ (біля передньої частини). Покладіть сценарії (та будь-які інші програми), які ви хочете виконати безпосередньо, не вказуючи ім'я шляху тут, або посилаючись сюди, де є фактичні програми.
Джонатан Леффлер

1
Після того, як ви дотримуєтесь відповіді, поданої нижче, щоб скинути ".sh", ви можете перейменувати файл: mv example.sh exampleа потім exampleповинен працювати самостійно.
PJ Brunet

Відповіді:


434

Додайте "шебанг" у верхній частині файлу:

#!/bin/bash

І зробіть свій файл виконуваним ( chmod +x script.sh).

Нарешті, змініть свій шлях, щоб додати каталог, де знаходиться ваш скрипт:

export PATH=$PATH:/appropriate/directory

(як правило, потрібно $HOME/binзберігати власні сценарії)


Ей, дякую за вашу відповідь. Я спробував це. Тепер я можу запустити його без команди "sh". Але мені все одно доводиться префіксувати команду "./", чого я не хочу. :)
Рамез Хуссейн

5
Дивіться коментарі щодо шляху. Вам потрібно помістити свій скрипт у каталог, який ви повинні додати до своєї PATH.
fge

2
у моєму випадку це не спрацювало. але source script.shпрацював чудово, а точніше source <filename_without_any_extension_type>
MycrofD

4
source ./my-cool-script(або . ./my-cool-script) забруднить поточний сеанс оболонки будь-якими змінними, визначеними в сценарії. Sourcing не повинен використовуватися, якщо ви не хочете явно змінити сеанс оболонки, встановивши середовище vars, змінивши каталог тощо. Дійсно жахливі помилки можуть призвести інакше, оскільки змінні одного виконання сценарію, якщо це буде зроблено за допомогою джерела, можуть вплинути на виконання іншого сценарію.
Даніель Уолтріп

3
Якщо ви впевнені, що папка сценарію знаходиться в PATH, і вона все ще не працює ./, тоді у вас може виникнути зіткнення імені. Спробуйте перейменувати.
хорви

66

Ось деякі передумови безпосередньо використання імені сценарію:

  1. Додайте she-bang (#!/bin/bash)рядок у самому верху.
  2. Використовуючи chmod u+x scriptnameзробити сценарій виконуваним. (звідки scriptnameназва вашого сценарію)
  3. Помістіть сценарій під /usr/local/binпапку.
  4. Запустіть сценарій, використовуючи лише ім'я сценарію.

Примітка . Причина, яку я запропонував розмістити в /usr/local/binпапці, полягає в тому, що, швидше за все, це буде вже доданий шлях до вашої PATH variable.

Оновлення:

Якщо у вас немає доступу до /usr/local/binпапки, виконайте такі дії:

  1. Створіть папку у своєму домашньому каталозі і давайте її назвемо myscripts.
  2. Виконайте ls -lartу своєму домашньому каталозі, щоб визначити сценарій запуску, який використовує ваша оболонка. Це повинно бути .profileабо .bashrc.
  3. Виявивши сценарій запуску, додайте наступний рядок у свій сценарій - export set PATH=$PATH:~/myscript.
  4. Після додавання надрукуйте сценарій запуску або вийдіть із системи та ввійдіть назад.
  5. Виконайте свій сценарій, використовуючи scriptname.

Я спробував це зробити, але у мене немає дозволу на доступ до папки / usr / local / bin. Я використовую університетський комп’ютер.
Рамез Хуссейн

1
Скажіть, будь ласка, що ви маєте на увазі під "джерелом сценарію запуску"?
Рамез Хуссейн

1
Вибір сценарію запуску означає його виконати, щоб нововстановлений параметр PATH змінна підбирався оболонкою. Це можна зробити, роблячи . .bashrc. Тобто, просто поставте ., spaceа потім імені вашого початкового сценарію.
jaypal singh

Я не знаю, в чому проблема з системою. Я створив новий сценарій оболонки під назвою "привіт" із просто "відлунням" привіт "". Я змінив його дозволи та спробував ./hello. Це не працює. в ньому сказано
Рамез Хуссейн

Які зміни ви внесли до своїх сценаріїв запуску?
jaypal singh

20

Просто переконайтесь, що він виконуваний, використовуючи chmod +x. За замовчуванням поточний каталог не знаходиться на вашому PATH, тому вам потрібно буде виконати його як ./script.sh- або іншим чином посилатися на нього кваліфікованим шляхом. Крім того, якщо вам справді потрібно просто script.sh, вам потрібно буде додати його до своєї ПАТИ. (Можливо, у вас немає доступу для зміни системного шляху, але ви майже напевно можете змінити PATH вашого власного поточного середовища.) Це також передбачає, що ваш сценарій починається з чогось подібного #!/bin/sh.

Ви також можете використовувати псевдонім, який насправді не пов'язаний з сценарієм оболонки, а лише з оболонкою і простий як:

alias script.sh='sh script.sh'

Що дозволить вам використовувати просто script.sh(буквально - це не працюватиме для жодного іншого *.shфайлу) замість sh script.sh.


Гей! Спасибі за Вашу відповідь. Я раніше спробував використовувати псевдоніми. Але нічого не сталося. Я розмістив його відразу після рядка "#! / Usr / local / bin / bash". Що ви вважаєте неправильним?
Рамез Хуссейн

1
Псевдонім не може бути визначений у вашому сценарії - він повинен бути оголошений як частина вашого поточного середовища. Тож просто запустіть aliasкоманду у вікні оболонки, і тоді буде доступний псевдонім для запуску команди.
ziesemer

17

У цьому прикладі буде викликано файл myShell

Перш за все нам знадобиться зробити цей файл, який ми можемо просто почати, набравши наступне:

sudo nano myShell

Зауважте, ми не поставили .shрозширення? Це тому, що коли ми запускаємо його з терміналу, нам потрібно буде лише набрати myShell, щоб запустити нашу команду!

Тепер, у нано, ОБОВ'ЯЗКОВО слід #!/bin/bashвийти з нового рядка, перш ніж продовжувати.

Для демонстрації я додам основну Hello World!відповідь

Отже, я набираю таке:

echo Hello World!

Після цього мій приклад повинен виглядати так:

#!/bin/bash
echo Hello World!

Тепер збережіть файл та запустіть цю команду:

sudo chmod +x myShell

Тепер ми зробили виконуваний файл, до якого ми можемо перемістити його /usr/bin/, використовуючи наступну команду:

sudo cp myShell /usr/bin/

Просто для того, щоб переконатися, що машина може виконати її належним чином, нам знадобиться перезавантажити машину

я використав sudo shutdown -r now

Вітаю! Наша команда зараз виконана! У терміналі ми можемо набрати, myShellі це слід сказатиHello World!


1
Не слід ставити власні файли /usr/bin- у багатьох системах підбираються /usr/local/binдля цього і резервуються /usr/binсуворо для ОС.
трійчатка

Немає необхідності у sudo chmodвласному файлі.
тріплей

Немає необхідності перезавантажувати машину.
Щонайбільше

14

Ви повинні включити виконуваний біт для програми.

chmod +x script.sh

Тоді можна використовувати ./script.sh

Ви можете додати папку до PATH у вашому .bashrcфайлі (розташованому у вашому домашньому каталозі). Додайте цей рядок до кінця файлу:

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

Я забув згадати, що я вже встановив правильні дозволи. Я використав команду "chmod 755 script.sh"
Рамеес Хуссейн

6

Ви можете ввести sudo install (назва скрипту) / usr / local / bin / (те, що ви хочете ввести для виконання вказаного сценарію)

наприклад: sudo install quickcommit.sh /usr/local/bin/quickcommit введіть пароль

тепер може працювати без .sh та в будь-якому каталозі


3

Додайте. (поточний каталог) до вашої змінної PATH.
Це можна зробити, відредагувавши .profile-файл.
помістіть наступний рядок у .profile-файл.
PATH=$PATH:.

Просто переконайтеся, що #!/bin/bashна початку сценарію додано рядок Shebang ( ), і зробіть сценарій виконуваним (використовуючи chmod +x <File Name>)


0

Ось мій резервний сценарій, який дасть вам ідею та автоматизацію:

Сервер: Ubuntu 16.04 PHP: 7.0 Apache2, Mysql тощо ...

# 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

змінити / home / user у свій каталог користувачів та ввести: резервну копію в будь-якому місці терміналу, щоб запустити скрипт! (якщо припустити, що / usr / bin на вашому шляху)


0

Введіть "#!/bin/sh"перед сценарієм. Потім збережіть його, script.shнаприклад. скопіюйте його $HOME/bin або $HOME/usr/bin
Каталог може бути різним у різних дистрибутивах Linux, але вони закінчуються 'bin' та знаходяться в домашній каталог cd $HOME/bin або $HOME/usr/bin
Type chmod 700 script.sh
І ви можете запустити його, просто набравши run.sh на терміналі. Якщо це не спрацювало, спробуйте chmod +x run.sh замість chmod 700 run.sh


Частини цієї відповіді, які не перезапускають інформацію з дуже старих існуючих відповідей, плутаються.
трійка

0

Зробіть будь-який файл виконуваним


Скажімо, у вас є виконуваний файл під назвою migrate_linux_amd64, і ви хочете запустити цей файл у такій команді, як "migrate"

  1. Спочатку протестуйте виконуваний файл з розташування файлу:
[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. Переконайтеся, що у вас є права виконавця на файл,
    -rwxr-xr-x 1 oracle oinstall 7473971 May 18 2017 migrate.linux-amd64
    якщо ні, запустітьchmod +x migrate.linux-amd64

  2. Потім скопіюйте файл у /usr/local/bin. Цей каталог належить root, використовуйте sudo або перемикайте на root та виконайте наступну операцію

sudo cp migrate.linux-amd64 /usr/local/bin
sudo chown oracle:oracle /user/local/bin/migrate.linux.amd64
  1. Потім створіть символічне посилання, як показано нижче
sudo ln /usr/local/bin/migrate.linux.amd64 /usr/local/bin/migrate
sudo chown oracle:oracle /usr/local/bin/migrate
  1. Нарешті додайте / usr / local / bin у свій шлях чи профіль користувача
export PATH = $PATH:/usr/local/bin
  1. Потім запустіть команду як "перемістити"
[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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.