bash:読み取り専用ルートパーティションでread <<<"$ VARIABLE"を使用するといくつかの問題があります。既知の回避策がありますか?

bash:読み取り専用ルートパーティションでread <<<"$ VARIABLE"を使用するといくつかの問題があります。既知の回避策がありますか?

偶然にも、ATA-ID-デバイス名スクリプトを使用する必要がありました(ここで見つけることができます:https://serverfault.com/questions/244944/linux-ata-errors-translated-to-a-device-name/426561#426561)の中読み取り専用 /分割。気になる場合は、/パーティションにアクセスできますが、デフォルトでは読み取り専用でマウントされているUbuntu回復コンソールがあります。そうでなければ、R / Oシステムでは、次のような特定の行が私のスクリプトが奇妙に動作するという事実を見つけることができなかったので幸いです。

IFS=: read HostMain HostMid HostSub <<< "$HostFull"

これは実際にいいえ書き込み権限なしで動作します。しかし、失敗するとは思いません。しかし、明らかに<<<オペレータはする一部の一時ファイルはどこかに作成する必要があります。

しかし、一時ファイルの生成を防ぐ方法はありますか?それともファイルが書き込まれる場所を指定する方法はありますか? Ubuntu回復コンソールでは、奇妙なことに/runディレクトリに書き込み権限があるので、何らかの方法で一時ファイルが通常以外の場所に書き込むように「通知する」ことができればread問題ありません。

答え1

配列を使用すると、一時ファイルなしで文字列を解析できます。ワイルドカードをオフにすることを忘れないでください。

set -f
IFS=: Hosts=($HostFull)
HostMain=${Hosts[0]}
HostMid=${Hosts[1]}
HostSub=${Hosts[2]}
set +f

答え2

@gniourf_gniourfに同意します。書き込み権限が必要な場合がありますが、ファイル記述子(ほとんどのファイル)は必要ありません。

読み取り専用パーティションでコマンドの実行を追跡してこれをテストできます。

{ strace -p "$$" & sleep 1; read var1 <<< "hi"; sleep 1; kill "$1"; }

上記のコードはstraceBash シェル (process $$) で実行されます。その後、1秒待ってからreadHERE STRINGで実行されます。"hi"この位置にロープを置きました。それからもうsleep1秒待ってから。killstrace

はい

O_WRONLYこの出力を解析すると、ファイルに書き込むためにファイルが開いていることがわかります。

open("/tmp/sh-thd-4137571604", O_WRONLY|O_CREAT|O_EXCL|O_TRUNC, 0600) = 3

上記で、コマンドシーケンスがどのファイルに書き込まれているかを確認できます。

答え3

私はそのような操作に位置パラメータが非常に役に立つと思います。また、通常はすべてのシェルに移植可能であり、フォークや一時ファイルは必要ありません。

$ HostFull=main:mid:sub    
$ oldIFS=$IFS; IFS=:; set -- $HostFull; IFS=$oldIFS
$ echo $1
main
$ echo $2
mid
$ echo $3
sub

関連情報