wget в сценарии оболочки с использованием шаблона

Чтобы убедиться, что вы создали папку /mnt/Media? Кстати, здесь есть аналогичный случай, может быть хорошо проверить: http://ubuntuforums.org/archive/index.php/t-1607610.html

Прочитайте последние несколько потоков, он решил путем удаления Microsoft Live Essential. Вы также можете проверить, включен ли режим NETBIOS на ПК Windows, и нет доступа к брандмауэру из сети на внешний жесткий диск.

1
задан 23 May 2018 в 14:54

3 ответа

я не знаком в tcsh, так что может быть хорошим решением для этого в tcsh.

, что сказал, я знаком с bash, и можете увидеть, что может быть причиной этой проблемы. Обратите внимание на цитирование:

[Ф1]

это внешний слой котировки и кроме того, внутренний слой котировок для [ф10]. Предположительно, вы используете внутренний слой, потому что это, как это будет выглядеть, если вы на самом деле набрали команду в командной строке.

таким образом, раковина выполняет различные дополнения в командной строке, как переменная расширения, подстановочных и т. д. Так в команду:

[Ф2]

оболочка будет расширяться [F11], чтобы его содержание, проанализировать поле разделения, выделения содержание [F12] для отдельных слов и подстановки расширения (или подстановка), где команда не выполняется:

[Ф3]

обратите внимание, как кавычки [от f13] предотвратить ошибку? Но нельзя использовать цитаты в ваш скрипт, так как цитаты предотвратит расщепление поле, и вы опираетесь на поле разделения, так что различные варианты [ф14] ([ф15], [ф16], и т. д.) передаются как отдельные аргументы [зг17].

вот демо отличия С и без кавычек:

[Ф4]

я представляю, как это может работать, если Вы использовали:

[ф5]

, однако такие риски подстановки расширения, если Вы не используете [ф18], и рабочая папка имеет файлы с [зг19]:

[ф6]

опять же, я не достаточно опытный в tcsh, чтобы предложить хорошее решение, но я знаю, что достойное решение в bash:

использовать массивы для построения командной строки.

в bash, ваш скрипт будет выглядеть так:

[ф7]

я сделал несколько изменений. Вы назначили [20 фунтов], чтобы [клавиши f21], но затем петли всех аргументов (по сути, это то, что [ф22] будет делать), но без использования этих аргументов в цикле, который не имеет смысла - второй аргумент скрипта игнорируется, но третий аргумент используется как параметр. Приведенный фрагмент кода на Python, я буду считать только первый аргумент-это идентификатор и остальные варианты [ф23].

теперь, используя массив вот так:

[ф8]

позволяет расширять на каждое отдельное слово в массиве, при этом не рискуя местах разделения или именем поколения, используя [ф24] в bash:

[F9] и

каждый аргумент прекрасно сохранились.

1
ответ дан 8 June 2018 в 14:01

Я не знаком с tcsh, поэтому в tcsh может быть хорошее исправление.

Это говорит о том, что я знаком с bash и вижу, что может вызвать эту проблему. Обратите внимание на цитату здесь:

set OPT="-r -c -nH -np -nd -e robots=off -P PATH/$ID -A 'pattern*.extension' -a $ID.log"

Существует внешний слой кавычек и, кроме того, внутренний слой кавычек для pattern*.expansion. Предположительно, вы используете внутренний слой, потому что так оно и будет выглядеть, если вы действительно набрали команду в оболочке.

Как это работает, оболочка выполняет различные расширения в командной строке, например переменную расширение, расширение подстановочных знаков и т. д. Таким образом, в команде, подобной:

wget $OPT ...

, оболочка будет расширять $OPT до ее содержимого, выполнять разделение поля, разделяя содержимое $OPT на отдельные слова, и расширением подстановочных знаков (или globbing), в котором команда не работает:

> set foo="'*'" > echo $foo echo: No match. > echo "$foo" '*'

Обратите внимание, что кавычки вокруг $foo предотвратили ошибку? Но вы не можете использовать кавычки в своем сценарии, поскольку кавычки также предотвращают разделение поля, и вы полагаетесь на разделение поля, чтобы различные опции в $OPT (-r, -c и т. Д.) Передавались как отдельные аргументы wget.

Ниже приведено описание различий с кавычками и без них:

> printf "|%s|\n" "$OPT" |-r -c -nH -np -nd -e robots=off -P PATH/foo -A 'pattern*.extension' -a foo.log| > printf "|%s|\n" $OPT printf: No match. > printf "|%s|\n" -r -c -nH -np -nd -e robots=off -P PATH/$ID -A 'pattern*.extension' -a $ID.log |-r| |-c| |-nH| |-np| |-nd| |-e| |robots=off| |-P| |PATH/foo| |-A| |pattern*.extension| |-a| |foo.log|

Я полагаю, это может сработать, если вы использовали:

set OPT="-r -c -nH -np -nd -e robots=off -P PATH/$ID -A pattern*.extension -a $ID.log"

Но это может повлиять на расширение подстановочных знаков, если вы не используете "$OPT", а рабочий каталог имеет файлы, соответствующие pattern*.extension:

> touch pattern-abc.extension > printf "|%s|\n" $OPT printf: No match. > set set OPT="-r -c -nH -np -nd -e robots=off -P PATH/$ID -A pattern*.extension -a $ID.log" > printf "|%s|\n" $OPT |-r| |-c| |-nH| |-np| |-nd| |-e| |robots=off| |-P| |PATH/foo| |-A| |pattern-abc.extension| <---- tcsh expanded pattern*.extension |-a| |foo.log|

Опять же, я недостаточно квалифицирован в tcsh, чтобы предложить хорошее решение, но я знаю достойное решение в bash:

Используйте массивы для построения команд.

В bash ваш скрипт будет выглядеть так:

#!/bin/bash ID=$1 #just an ID for subfolders shift OPT2=("$@") #additional options that can be passed to wget OPT=(-r -c -nH -np -nd -e robots=off -P PATH/"$ID" -A 'pattern*.extension' -a "$ID".log) OOP=(--progress=bar:force --no-check-certificate) echo wget "${OPT[@]}" "${OOP[@]}" "${OPT2[@]}" "https://.../$ID/" wget "${OPT[@]}" "${OOP[@]}" "${OPT2[@]}" "https://.../$ID/"

Здесь я внес несколько изменений. Вы назначили $3 на OPT2, но затем перебираете все аргументы (фактически, это то, что while ($1 != '') ... shift будет делать), но без использования этих аргументов в цикле, что не имеет смысла - второй аргумент сценарий эффективно игнорируется, но третий аргумент используется как опция. Учитывая фрагмент Python, я предполагаю, что только первый аргумент - это идентификатор, а остальные - параметры wget.

Теперь, используя такой массив:

OPT=(-r -c -nH -np -nd -e robots=off -P PATH/"$ID" -A 'pattern*.extension' -a "$ID".log)

Позволяет нам расширять каждое отдельное слово в массиве, не подвергая риску разбиение поля или генерации имени файла, используя "${OPT[@]}" в bash:

$ printf "|%s|\n" "${OPT[@]}" |-r| |-c| |-nH| |-np| |-nd| |-e| |robots=off| |-P| |PATH/foo| |-A| |pattern*.extension| |-a| |foo.log|

Каждый аргумент отлично сохраняется.

0
ответ дан 17 July 2018 в 13:39

Я не знаком с tcsh, поэтому в tcsh может быть хорошее исправление.

Это говорит о том, что я знаком с bash и вижу, что может вызвать эту проблему. Обратите внимание на цитату здесь:

set OPT="-r -c -nH -np -nd -e robots=off -P PATH/$ID -A 'pattern*.extension' -a $ID.log"

Существует внешний слой кавычек и, кроме того, внутренний слой кавычек для pattern*.expansion. Предположительно, вы используете внутренний слой, потому что так оно и будет выглядеть, если вы действительно набрали команду в оболочке.

Как это работает, оболочка выполняет различные расширения в командной строке, например переменную расширение, расширение подстановочных знаков и т. д. Таким образом, в команде, подобной:

wget $OPT ...

, оболочка будет расширять $OPT до ее содержимого, выполнять разделение поля, разделяя содержимое $OPT на отдельные слова, и расширением подстановочных знаков (или globbing), в котором команда не работает:

> set foo="'*'" > echo $foo echo: No match. > echo "$foo" '*'

Обратите внимание, что кавычки вокруг $foo предотвратили ошибку? Но вы не можете использовать кавычки в своем сценарии, поскольку кавычки также предотвращают разделение поля, и вы полагаетесь на разделение поля, чтобы различные опции в $OPT (-r, -c и т. Д.) Передавались как отдельные аргументы wget.

Ниже приведено описание различий с кавычками и без них:

> printf "|%s|\n" "$OPT" |-r -c -nH -np -nd -e robots=off -P PATH/foo -A 'pattern*.extension' -a foo.log| > printf "|%s|\n" $OPT printf: No match. > printf "|%s|\n" -r -c -nH -np -nd -e robots=off -P PATH/$ID -A 'pattern*.extension' -a $ID.log |-r| |-c| |-nH| |-np| |-nd| |-e| |robots=off| |-P| |PATH/foo| |-A| |pattern*.extension| |-a| |foo.log|

Я полагаю, это может сработать, если вы использовали:

set OPT="-r -c -nH -np -nd -e robots=off -P PATH/$ID -A pattern*.extension -a $ID.log"

Но это может повлиять на расширение подстановочных знаков, если вы не используете "$OPT", а рабочий каталог имеет файлы, соответствующие pattern*.extension:

> touch pattern-abc.extension > printf "|%s|\n" $OPT printf: No match. > set set OPT="-r -c -nH -np -nd -e robots=off -P PATH/$ID -A pattern*.extension -a $ID.log" > printf "|%s|\n" $OPT |-r| |-c| |-nH| |-np| |-nd| |-e| |robots=off| |-P| |PATH/foo| |-A| |pattern-abc.extension| <---- tcsh expanded pattern*.extension |-a| |foo.log|

Опять же, я недостаточно квалифицирован в tcsh, чтобы предложить хорошее решение, но я знаю достойное решение в bash:

Используйте массивы для построения команд.

В bash ваш скрипт будет выглядеть так:

#!/bin/bash ID=$1 #just an ID for subfolders shift OPT2=("$@") #additional options that can be passed to wget OPT=(-r -c -nH -np -nd -e robots=off -P PATH/"$ID" -A 'pattern*.extension' -a "$ID".log) OOP=(--progress=bar:force --no-check-certificate) echo wget "${OPT[@]}" "${OOP[@]}" "${OPT2[@]}" "https://.../$ID/" wget "${OPT[@]}" "${OOP[@]}" "${OPT2[@]}" "https://.../$ID/"

Здесь я внес несколько изменений. Вы назначили $3 на OPT2, но затем перебираете все аргументы (фактически, это то, что while ($1 != '') ... shift будет делать), но без использования этих аргументов в цикле, что не имеет смысла - второй аргумент сценарий эффективно игнорируется, но третий аргумент используется как опция. Учитывая фрагмент Python, я предполагаю, что только первый аргумент - это идентификатор, а остальные - параметры wget.

Теперь, используя такой массив:

OPT=(-r -c -nH -np -nd -e robots=off -P PATH/"$ID" -A 'pattern*.extension' -a "$ID".log)

Позволяет нам расширять каждое отдельное слово в массиве, не подвергая риску разбиение поля или генерации имени файла, используя "${OPT[@]}" в bash:

$ printf "|%s|\n" "${OPT[@]}" |-r| |-c| |-nH| |-np| |-nd| |-e| |robots=off| |-P| |PATH/foo| |-A| |pattern*.extension| |-a| |foo.log|

Каждый аргумент отлично сохраняется.

1
ответ дан 20 July 2018 в 13:43

Другие вопросы по тегам:

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