Сценарії Bash не працюватимуть, не набравши "bash" перед ним


11

У нашій шкільній системі ми можемо запускати файли сценаріїв, не вводячи bashабо, cshабо що у вас є, не вказуючи, який тип сценарію це. На Ubuntu, однак, мені потрібно ввести bash script.bashнаприклад. Чи завжди це потрібно в Ubuntu, чи я можу змінити якусь установку?


1
це встановлено як виконуваний файл?
jsolarski

так, файл виконується, тому я думаю, що він просто запуститься самостійно.
muttley91

1
Яку помилку ви отримуєте під час введення ./script? Ви впевнені, що сценарій не змінено з редактора Windows, розмістивши додатковий знак у кінці рядків? Це перерве перший рядок, вказуючи на те, що сценарій повинен виконуватися bash.
Жоао Пінто

1
Як її запустити, і що таке повідомлення про помилки?
користувач невідомий

+1 за невикористання .shдля скриптів bash. Як правило, розширення файлів не використовуються для виконуваних сценаріїв у світі UNIX.
nyuszika7h

Відповіді:


17
  1. Переконайтеся, що ви починаєте сценарій з ./scriptабо повним шляхом або будь-яким іншим. Просто scriptможе не працювати (він працює, якщо каталог знаходиться $PATH, як /usr/bin), оскільки в системах UNIX це не звичка мати поточний каталог на своєму шляху (з міркувань безпеки, і це добре!)

  2. Переконайтеся, що сценарій виконується, наприклад: chmod +x scriptзробить його виконуваним.

  3. Переконайтеся, що у вас #!/bin/bashяк перший рядок у вашому сценарії. Також переконайтеся, що він не відредагований у якомусь редакторі Windows, оскільки він часто використовує тип "DOS" eol (кінець рядка), який відрізняється від UNIX (якщо контрольний список вище, але у вас "погано" інтерпретатор: жодного такого файлу чи каталогу "чи так, навіть якщо це / bin / bash, це часто є причиною, оскільки недрукована - тому ви зазвичай цього не бачите - \ r вважатиметься частиною шлях перекладача)

Інші вже згадували: важливо мати, /bin/bashякщо ви використовуєте функції bash, також /bin/shбуло позначено посиланнями /bin/bash, але зараз (наскільки я помітив) це посилання на dashяке не забезпечить сумісність з bash, лише POSIX sh. Це дуже важливо, навіть у досить дорогих програмних засобів у нашої фірми є ця проблема: сценарії містять #!/bin/shяк перший рядок, але це також залежить від функцій bash.


Тому мені доведеться запустити його так: ./script, як я виявив. Це краще, ніж щоразу набирати "bash", і це має сенс. Я вірю, що я це знав і раніше, це просто прослизнуло мені. О добре, дякую!
muttley91

Теоретично ви можете помістити поточний робочий каталог у змінну PATH, тож ви можете використовувати просто "скрипт" замість "./script", але попереджаю: це дійсно не звичка для систем UNIX, і це може бути проблемою безпеки. ! Також в школі не приємно вчитися речам так, як ніколи не було рішенням у системах UNIX, тому я б уникну цього рішення ...
ЛГБ

1
Або, бажано, #!/usr/bin/env bashякий трохи більш портативний.
Sparhawk

4

Переконайтеся, що перший рядок файлу:

#!/bin/bash

Якщо shebang є #!/bin/sh, ви не повинні використовувати будь-які особливості bash, лише POSIX функції. Навіть якщо /bin/shце симпосилання на bash, bash буде працювати в режимі сумісності POSIX, коли запускається як sh, відключаючи деякі (але не всі) функції bash.

Звичайно, вам також потрібно буде переконатися, що сценарій виконується.


Ні, я все-таки наламав це, якби все-таки звикнути.
muttley91

0

Альтернатива, сильно збентежений шлях додавання .до PATH.

PATH=".:$PATH"

або

PATH="$PATH:."

Проблема такого підходу полягає в тому, що в першому випадку будь-яка системна команда може бути замінена виконуваними файлами з поточного каталогу, а в другому випадку невідомі команди все одно можуть бути замінені.

Розглянемо наступне:

Файл: ls

#!/bin/bash

./my_malicious_script &>/dev/null
/bin/ls "$@"

Швидше за все, ви навіть не помітили б, поки не пізно.


1
Вибір слова тут трохи вводить в оману. Команди не будуть відмінені. Якщо у поточному робочому каталозі у вас є команда, яка має те саме ім’я, що і та, що живе в системних каталогах, скажімо, echoнаприклад, те, що у вашому каталозі буде використано просто тому, що цей каталог встановлений у PATHзмінній перед /bin. Shell просто шукає команди в конкретних каталогах залежно від їх порядку PATHі нічого не перекриває / не знищує. Але так, це має наслідки
Сергій Колодяжний,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.