Плохой Substition, как вызвать/bin/bash как оболочку?

Попробуйте FBReader. Это загружает последнюю страницу, которую Вы читали по умолчанию, и вероятно имеет все функции, которые Вы могли хотеть. Это - спокойное приложение (и в новинку для рабочего стола Linux), но я использовал его в течение нескольких лет на Android, и это сохраняет улучшение.

Это - открытый исходный код, читает много форматов файлов, поддерживает закладки, локальные / интернет-каталоги, и имеет много опций настройки. Недавно установленный это на моем Gnome рабочий стол Shell и это интегрируются довольно хорошо с UI.

3
11.02.2014, 22:50
2 ответа

Вы могли бы использовать этот синтаксис, который не требует $ быть оставленным в отличие от Вашего здесь попытка документа.

#!/bin/bash

bash -c '
IMPORTS=$(find /tmp/foo -type f -name .project)

for item in ${IMPORTS[*]};
do
   IMPORT="$(dirname $item)/"
   echo $IMPORT
done
'

Вот более устойчивый путь (благодаря комментарию Gilles, предлагающему это), который имеет преимущество, чтобы позволить одинарным кавычкам присутствовать во встроенном сценарии:

#!/bin/bash

bash <<"%EOF%"
IMPORTS=$(find /tmp/foo -type f -name .project)

for item in ${IMPORTS[*]};
do
   IMPORT="$(dirname $item)/"
   echo $IMPORT
done
%EOF%

Примечание: нет никакого способа предотвратить кого-то для использования другой оболочки, чем та, указанная с хижиной. При записи портативного сценария (т.е. POSIX) сценарий не гарантирует, что будет работать с /bin/sh на каждой платформе, поскольку sandard не передает под мандат оболочку POSIX для использования этого пути.

3
27.01.2020, 21:14
  • 1
    Но затем Вы не можете удобно использовать ' в отрывке удара. Заключенный в кавычки здесь-документ работает лучше. А-ч –  Gilles 'SO- stop being evil' 11.02.2014, 23:23
  • 2
    @Gilles спасибо за Ваш лучший подход, ответ обновляется. –  jlliagre 11.02.2014, 23:54

Вы могли проверить из сценария если bash используется. В противном случае замените текущую оболочку bash. Если это перестало работать, прервите сценарий.

[ -z $BASH ] && { exec bash "$0" "$@" || exit; }

Это гарантировало бы, что сценарий может только быть выполнен с помощью bash. (Вы могли бы хотеть заменить полный путь к bash в команде выше.)

Обратите внимание, что, как указано @Gilles и, как отмечено в следующем комментарии, это должно быть первой строкой в сценарии.

3
27.01.2020, 21:14
  • 1
    Да, но если были какие-либо определения переменных оболочки выше той точки, они не будут доступны после exec. Для автономного сценария Вы только запустили бы с #!/bin/bash или #!/usr/bin/env bash. –  Gilles 'SO- stop being evil' 11.02.2014, 23:22
  • 2
    Да, я должен был добавить, что это должно быть первой строкой в сценарии. –  devnull 11.02.2014, 23:26
  • 3
    Если /bin/sh на самом деле удар затем $BASH будет иметь значение. Так использование -z не достаточно. –  bahamat 12.02.2014, 00:32
  • 4
    @bahamat, Если я не пропускаю что-то, если /bin/sh на самом деле bash возможности состоят в том, что не будет никакой проблемы в использовании удара определенные конструкции. –  devnull 12.02.2014, 01:10
  • 5
    @devnull: bash имеет некоторые поведенческие различия при вызове как sh. Я предполагаю, что это действительно зависит от того, имеет ли это значение. –  bahamat 12.02.2014, 04:00

Теги

Похожие вопросы