Что не так с этим скриптом?

Попробуйте запустить import sys;print(sys.version_info) изнутри geany.

1
задан 22 August 2014 в 23:02

1 ответ

Как говорит МакЛовин, автоматически заданная переменная readonly UID (и EUID) является особой особенностью bash (и некоторых других оболочек). Это не стандарт для оболочек в стиле Бурна, а sh нельзя полагать, чтобы установить эти переменные. В частности, sh в Ubuntu (по умолчанию) dash, который их не устанавливает.

У вас есть две возможности:

Вызывают запуск сценария на bash вместо sh. Измените свой сценарий, чтобы он был более портативным и не требовал bash.

Запуск сценария с помощью bash

Вы не сказали нам имя своего скрипта (это нормально). Я буду называть его cleanup, так как это имя похожего скрипта в руководстве, из которого вы работаете.

Обратите внимание, в частности, что я cleanup [!d11 ] называя это чем-то вроде cleanup.sh. Это потому, что я не рекомендую вам называть его суффиксом .sh:

Суффикс .sh предполагает, что он совместим с sh! Большинство скриптов вообще не имеют суффикса, а суффикс .sh или .bash может даже интерпретироваться как предполагающий, что ваш файл является «библиотекой», а не сценарием «верхнего уровня». То есть, он предоставляет код, который будет использоваться другими сценариями (например, с встроенным .), а не запускаться напрямую.

Однако, включая суффикс .sh, никак не повлияет на техническое поведение вашего скрипта.

Добавить строку hashbang как самую первую строку вашего скрипта: #!/bin/bash

Добавить строку hashbang [ ! d19] с chmod +x cleanup.

Теперь вы можете запустить свой скрипт, выполнив команду:

Суффикс .sh предполагает, что он совместим с sh! /path/to/cleanup, в общем. Если первое слово команды содержит /, оно интерпретируется как путь к исполняемому файлу. (В этом причина синтаксиса ./, так как . означает текущий каталог.) Первым словом я имею в виду команду до, но не включая ее первое незанятое пространство или вкладку: foo-bar/baz - это первое слово [ f29], а spam\ ham - это первое слово spam\ ham eggs, потому что пространство перед ham экранировано обратным слэшем. Большинство скриптов вообще не имеют суффикса, а суффикс .sh или .bash может даже интерпретироваться как предполагающий, что ваш файл является «библиотекой», а не сценарием «верхнего уровня». То есть, он предоставляет код, который будет использоваться другими скриптами (например, с встроенным .), а не запускаться напрямую.

Независимо от того, скрипт ли cleanup имеет строку #!... hashbang или что эта строка говорит:

/path/to/cleanup, в общем. Если первое слово команды содержит /, оно интерпретируется как путь к исполняемому файлу. (В этом причина синтаксиса ./, так как . означает текущий каталог.) Первым словом я имею в виду команду до, но не включая ее первое незанятое пространство или вкладку: foo-bar/baz - это первое слово [ f29], а spam\ ham - это первое слово spam\ ham eggs, поскольку пробел перед ham экранируется обратным слэшем. bash cleanup все равно (попытается) запустить его с bash в качестве интерпретатора ,

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

Создание вашего скрипта Portable

Если вы хотите сделать ваш сценарий переносимый, самый простой способ - не использовать $UID вообще, а вместо этого использовать какое-либо средство, доступное для всех оболочек в стиле Bourne.

В общем, нет встроенного средства оболочки для определения идентификатора пользователя , Но вы можете использовать МакЛовин говорит . Это внешняя программа, а не встроенная оболочка, но, как cat и bash , разумно ожидать, что она будет присутствовать.

id сам по себе выходы куча информации, но id -u дает только эффективный идентификатор пользователя.

Итак, вместо if [ "$UID" != "$ROOT_UID" ] вы можете использовать:

if [ "$(id -u)" != "$ROOT_UID" ]

cleanup , это не эквивалентно. $UID в bash дает реальный идентификатор пользователя, а id -u действительно соответствует bash $EUID. Если вы действительно хотите UID, а не EUID, используйте id -ru.

1
ответ дан 24 May 2018 в 04:24

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

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