Как запустить скрипт оболочки без использования команд «sh» или «bash»?


261

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

Вместо того: sh script.sh

Я хочу использовать: script.sh

Как я могу это сделать?

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

(ii) Я также читал о связывании скрипта с другим файлом в переменных PATH. Я использую свой университетский сервер, и у меня нет прав для создания файла в этих местах.


1
Ответы показывают, как сделать сценарий исполняемым, но, похоже, не раскрывают, как сделать его доступным. Для этого создайте себе каталог bin - $HOME/bin- если у вас его еще нет, добавьте его в свой PATH (около передней части). Поместите сценарии (и любые другие программы), которые вы хотите выполнить напрямую, без указания здесь пути или символических ссылок здесь, где находятся реальные программы.
Джонатан Леффлер

1
После того, как вы выполните ответ (ы) ниже, чтобы удалить «.sh», вы можете переименовать файл: mv example.sh exampleи тогда он exampleдолжен работать сам по себе.
PJ Brunet

Ответы:


434

Добавьте «Шебанг» вверху вашего файла:

#!/bin/bash

И сделайте ваш файл исполняемым ( chmod +x script.sh).

Наконец, измените ваш путь, чтобы добавить каталог, в котором расположен ваш скрипт:

export PATH=$PATH:/appropriate/directory

(как правило, вы хотите $HOME/binхранить свои собственные скрипты)


Эй, спасибо за ваш ответ. Я попробовал это. Теперь я могу запустить его без команды "sh". Но я все еще должен префикс команды с "./", который я не хочу. :)
Rameez Hussain

5
Смотрите комментарии о пути. Вы должны поместить свой скрипт в каталог, который вы должны добавить в свой PATH.
fge

2
это не сработало в моем случае. но source script.shработал нормально, а точнее source <filename_without_any_extension_type>
MycrofD

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

3
Если вы уверены, что папка сценария находится в переменной PATH, но она по-прежнему не работает ./, возможно, у вас есть конфликт имен. Попробуйте переименовать.
chorbs

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
Не могли бы вы сказать мне, что вы подразумеваете под «источником сценария запуска»?
Rameez Hussain

1
Выбор сценария запуска означает его выполнение, так что вновь установленный параметр переменной PATH выбирается оболочкой. Это может быть сделано, делая . .bashrc. То есть, просто положить .затем spaceи затем ваш стартовый имя сценария.
Джайпал Сингх

Я не знаю, в чем проблема с системой. Я создал новый скрипт оболочки с именем "hello", в котором есть только "echo" hello "". Я изменил его разрешения и попробовал ./hello. Это не работает. это
говорит-

Какие изменения вы внесли в свои сценарии запуска?
Джайпал Сингх

20

Просто убедитесь, что он исполняемый, используя chmod +x. По умолчанию текущий каталог отсутствует в вашей переменной PATH, поэтому вам нужно будет выполнить его как ./script.sh- или иным образом ссылаться на него по определенному пути. В качестве альтернативы, если вам действительно нужно просто script.sh, вам нужно добавить его в свой PATH. (У вас может не быть доступа для изменения системного пути, но вы почти наверняка можете изменить 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

Congrats! Наша команда сейчас выполнена! В терминале мы можем напечатать myShellи это должно сказатьHello World!


1
Вы не должны помещать свои собственные файлы во /usr/binмногие системы, предназначенные /usr/local/binдля этой цели и резервируемые /usr/binстрого для ОС.
tripleee

Там нет необходимости в sudo chmodвашем собственном файле.
tripleee

Нет необходимости перезагружать машину. Самое большее, вы должны
найти

14

Вы должны включить исполняемый бит для программы.

chmod +x script.sh

Тогда вы можете использовать ./script.sh

Вы можете добавить папку к PATH в вашем .bashrcфайле (находится в вашем домашнем каталоге). Добавьте эту строку в конец файла:

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

Я забыл упомянуть, что я уже установил правильные разрешения. Я использовал команду "chmod 755 script.sh"
Rameez Hussain

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 в свой каталог пользователя и введите: backupscript в любом месте терминала, чтобы запустить скрипт! (при условии, что / 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


Части этого ответа, которые не повторяют информацию из очень старых существующих ответов, перепутаны.
tripleee

0

Сделать любой файл исполняемым


Допустим, у вас есть исполняемый файл с именем migrate_linux_amd64, и вы хотите запустить этот файл как команда типа «мигрировать»

  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.