Просто по стечению обстоятельств мне пришлось использовать свой скрипт ATA-ID-имя-устройства (находится здесь: /server/244944/linux-ata-errors-translating-to-a-device-name/ 426561 # 426561 ) в разделе только для чтения/
. Если вам интересно, это была консоль восстановления Ubuntu, которая позволит вам получить доступ к вашему /
разделу, но по умолчанию будет монтировать его только для чтения. Я рад этому, потому что иначе я, вероятно, никогда бы не узнал, что мой скрипт ведет себя странно в системе R / O из-за определенной строки, вот этой:
IFS=: read HostMain HostMid HostSub <<< "$HostFull"
Это не работает, если нет разрешения на запись. Я не предполагал, что это потерпит неудачу. Но , видимо, <<<
оператор действительно требует , чтобы написать некоторый временный файл где - нибудь.
Но есть ли способ обойти создание временного файла или есть способ указать, куда файл записывается? В консоли восстановления Ubuntu, как ни странно, есть разрешение на запись в /run
каталог, так что это было бы возможно, если бы я мог как-то «сказать» read
записать временный файл в другое место, чем обычно.
/dev/fd
имеет к этому никакого отношения.<<<
это виновник, потому что он создает временный файл (который должен быть где-то записан).Ответы:
Массив может выполнять разбор строки без необходимости во временном файле. Не забудьте отключить тряску
источник
IFS
, если вы не уверены , что там нет места в$HostFull
качестве так:Hosts=( ${HostFull//:/ } )
. Или даже если есть пробелы:HostMain=${HostFull%%:*}; HostMid=${HostFull#*:}; HostSub=${HostMid#*:}; HostMid=${HostMid%:*}
(или что-то подобное, я запутался:D
).Я согласен с @gniourf_gniourf, вам, вероятно, нужен доступ для записи, но не к файловым дескрипторам, скорее всего, к файлу.
Вы можете проверить это, отследив выполнение вашей команды в разделе только для чтения.
Выше будет работать
strace
на оболочке Bash (процесс$$
). Затем он спит в течение 1 секунды, а затем запускаетсяread
из ЗДЕСЬ. Я положил строку"hi"
в этой позиции. Я тогда ещеsleep
на один второй и затем .kill
strace
пример
При анализе этого вывода вы заметите, что файл открывается как
O_WRONLY
, что для записи в файл.Выше мы можем видеть, в какой файл записывается ваша последовательность команд.
источник
read
то, что открывает файл для записи (это было бы глупо), это<<<
./tmp
это жёстко путь. И , наверное , вы уже догадались,/tmp
IS уже там, но только для чтения , как хорошо! И поскольку работа с этой консолью восстановления приведет к тому, что я войду в свою живую файловую систему, я бы не хотел вмешиваться в нее с помощью символических ссылок или чего-либо еще (даже в этой консоли).Я считаю, что позиционные параметры очень полезны для такого рода задач. Как правило, он также переносим на все оболочки и не требует ни вилок, ни временных файлов.
источник
$1
,$2
,$3
материал: помните , что в сценарии, это, как правило , стоит за аргумент , переданного в сценарий самого . - И пока мы на этом: если IFS должен быть пробелом, * IFS = * не будет использоваться в этом синтаксисе; вам придется явно указать IFS = '' .