Коли я хочу запустити .sh
файли в терміналі, мені потрібно поставити sh
перед ними.
Чи є спосіб уникнути цього і тим самим зберегти введення тексту?
Коли я хочу запустити .sh
файли в терміналі, мені потрібно поставити sh
перед ними.
Чи є спосіб уникнути цього і тим самим зберегти введення тексту?
Відповіді:
Якщо ви запускаєте свій скрипт із оболонки, вам фактично не потрібен #!/bin/sh
шебанг, як зазначено в цій відповіді - будь -яка система, схожа на Unix, яку я використовував, включаючи OS X, буде за замовчуванням, /bin/sh
якщо конкретний інтерпретатор не вказаний ( хоча це гарна ідея, оскільки не снаряди не знають, як виконати сценарій, якщо ви не надасте шебанг.)
Вам також не потрібно .sh
розширення. Ви робите необхідність створення виконуваних дозволів, наприклад ,
$ chmod +x script.sh
(Це $
підказка оболонки; я використовую її для ілюстрації команд, які ви даєте інтерактивній оболонці. Не вводите її!)
Однак, я думаю, у чому полягає ваша плутанина в тому, що ви створили сценарій, наприклад script.sh
, у поточному каталозі, і намагаєтесь виконати його, просто набравши текст script.sh
. напр
$ cat >script.sh
echo hello, world
^D
$ chmod +x script.sh
$ script.sh
-bash: script.sh: command not found
( ^D
означає control- D. Ви знайдете це позначення у багатьох підписаннях щодо використання Unix.)
Те, що script.sh
в даному випадку є сценарієм оболонки - лише половина проблеми; Ваша фактична проблема полягає в тому, що за замовчуванням оболонка не буде шукати в поточному каталозі програми. Однак це працює:
$ sh script.sh
hello, world
тому що sh
сприймає сценарій як аргумент.
Ви можете виконати скрипт - або, знову ж таки, будь - який виконуваний файл - у поточному каталозі, якщо він позначений виконуваним (тобто chmod +x
), вказавши, що ви хочете запустити цей у поточному каталозі:
$ ./script.sh
hello, world
Ви також можете перемістити сценарій до каталогу на своєму PATH
. Я рекомендую /usr/local/bin
для цього, якщо ваш сценарій призначений для використання bin
в усьому світі, або у вашому домі директорія, якщо сценарій призначений лише для вас. Останнє вимагає, щоб ви додали $HOME/bin
, що розширюється, до нового каталогу біна, до свого PATH
, додаючи .profile
у свій домашній каталог наступні рядки :
PATH=$HOME/bin:$PATH
export PATH
Нарешті, ви можете, якщо хочете, фактично додати поточний каталог до свого PATH
, що дозволить вам просто перейти до каталогу, що містить script.sh
- або будь-який інший виконуваний файл - і введіть
$ script.sh
виконати його. Однак я не рекомендую цю практику , оскільки зловмисник тепер може ввести вас у запуск довільного виконуваного файлу, скинувши виконуваний скрипт (названий, скажімо, ls
) у каталог, у якому ви будете знаходитись. Якщо ви дійсно хочете це зробити, просто додайте до свого .profile
:
PATH=.:$PATH
export PATH
sl
або lls
або l
... тобто, друкарські помилки. Просто залиште .
поза $PATH
. Крім того, ви не можете (або не повинні) обов'язково довіряти всім у своїй системі. Наприклад, припустимо , що є якась - то експлойт , який дозволяє зловмисникові кинути довільний файл в який - небудь каталог, але вони потребують в вас , щоб виконати цей файл, щоб перерости краще використовувати (наприклад, збір даних і домашній телефон). Оборона в глибину!
/tmp
будь-якій іншій світовій директорії.
/tmp
та ін. приїжджайте з територією.
Вам не потрібно телефонувати, sh
якщо файл сценарію позначений як виконуваний. У такому випадку ви можете назвати це моє ім’я так само, як і будь-яка інша команда з існуючої оболонки.
Щоб бути повністю належним, вам потрібно зробити дві речі:
Відредагуйте свій сценарій, щоб він містив директиву shebang у верхній частині сценарію:
#!/bin/sh
... Це скаже оболонці, який інтерпретатор використовувати для запуску сценарію; у цьому випадку /bin/sh
виконуваний файл.
Позначте сценарій як виконуваний вами командою chmod :
chmod u+x scriptname.sh
Після того як ви зробите обидва з них, ви зможете запустити свій скрипт, ввівши ім'я файлу сценарію в командному рядку. Вам потрібно буде знаходитися в тому ж каталозі, що і ваш сценарій, якщо ви також не зробите доданий крок додавання папки, що містить, до змінної PATH . Якщо вам не байдуже, яка оболонка запускає скрипт, вам не потрібен перший крок для вказівки, sh
але часто краще бути точним і встановити "шебангш".
/bin/sh
, хоча вони не шкодять.
ksh
сценаріїв ще в свої дні на HP-UX - але добре знати, що це не обов'язково.
exec
шебанга з оболонки, але якщо ви використовуєте syscall, ви отримуєте ENOEXEC
(помилка формату exec ). Вибачте з цього приводу, @bmike, @ ChrisW.Rea. Я зараз піду редагувати свою відповідь.