shopt працює в командному рядку, не знайдений під час запуску в сценарії


13

Я пишу сценарій, щоб скопіювати деякі файли навколо, і намагаюся використовувати, shopt -s dotglob щоб увімкнути cp, щоб копіювати dotfiles, як .jshintі що.

Я можу запускатись shopt -s dotglobпрямо під команду bash без помилок. Однак запуск сценарію видає помилку:

script.sh: 81: script.sh: shopt: not found

Я запускаю цей сценарій у bash shell із заголовком shebang #!/usr/bin/env bash. Рядок помилки:

shopt -s dotglob
cp -r $TEMP/img/* $TARGET/img/
cp -r $TEMP/js/* $TARGET/js/
cp -r $TEMP/less/* $TARGET/less/

Не знайшовши нічого корисного в Google, будь-яка ідея, в чому проблема?


Дякую за нагадування, вибрані відповіді на все, що я міг. Ще одне, окрім цього питання, на яке поки що немає гарної відповіді.
Куртоз

3
Спробуйте з більш простим #!/bin/bashзаголовком?
Останній

А яка версія Ubuntu?
Останній

2
@izx, тобто правильна відповідь, shoptє вбудованим баштом, shне має shopt, і повідомлення про помилку виглядає як повідомлення про помилку dash. Тому, швидше за все, помилка тут запускає скрипт bash sh(який в Ubuntu dashза замовчуванням). Навіть якщо shце симпосилання на bash, запуск сценарію bash з shне є тим самим, як з його запуском bash.
geirha

Відповіді:


23

Щоб сформувати відповідь з коментарів:

Багато людей за звичкою shзамість них виконують свої сценарії bash. Це хороша практика, якщо портативність викликає занепокоєння, але багато людей роблять це, оскільки вони копіюють щось, що вони бачили, не розуміючи цього.

Якщо ваш сценарій не повинен працювати в системі, яка не працює на робочому столі Linux (наприклад, запуск сценаріїв оболонок на пристроях Android зовсім інша), я рекомендую спочатку використовувати рядок Bash shebang:

#!/bin/bash

Цей рядок, коли це перший рядок у скрипті, визначає, який інтерпретатор (оболонка, наприклад bash або sh, Python тощо) викликається для його виконання. Якщо ви використовуєте вищевказаний рядок, ви отримаєте таку ж поведінку (майже), як і в командному рядку, якщо використовувати оболонку за замовчуванням. Якщо з міркувань переносимості чи переваг ви використовуєте іншу лінію шебанг, майте на увазі, що вам доведеться ознайомитися з документацією щодо оболонки, на яку ви посилаєтесь, навіть якщо оболонка, на яку ви посилаєтесь, є симпосиланнями на Bash.


5
Для того, щоб бути повністю крос-системою, я вважаю за краще: так #!/usr/bin/env bash як завдання env - знати, який баш використовувати (на випадок, якщо, наприклад, ви його зафіксували).
shrikeh

-1

Вам потрібно вийти з zsh та активувати bash, як показано:

exec bash

Виконати команду

source ~/.bashrc

Після чого ви можете реагувати zsh:

exec zsh

Сподіваюся, що це допомагає


Хммм. 1) Я не думаю, що ОП використовував zsh, 2) AFAIK ~/.basrcв цьому випадку управляється bash при запуску, тому немає необхідності називати це явно, 3) де виконується команда OP? і 4) execдвократне використання ви втрачаєте будь-які зміни середовища, які ви зробили в початковій оболонці zsh, що не відбудеться, якби ви просто викликали bash.
ксеноїд

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