web-dev-qa-db-ja.com

MacOSでRAMディスクを作成する

次のコマンドを使用してMacOSでRAMディスクを作成しようとしています

diskutil erasevolume HFS+ RAM_Disk_512MB `hdiutil attach -nomount ram://16384`

これはデスクトップでは正常に機能しているようですが、ラップトップで実行しようとすると、次のエラーが発生します

Unable to find disk for hdiutil attach -nomount ram://16384

グーグルはあまり現れていません。誰かが私が間違っているかもしれないこと、または私がこれをどのように解決することができるかについての考えを持っていますか?

私に問題を与えているこのシステムはMacOS10.13.6を実行しています

1
HXSP1947

短い答え:

_diskutil erasevolume HFS+ RAM_Disk_512MB $(hdiutil attach -nomount ram://16384)
_

元の問題の説明:元の問題は、間違った引用符(逆引用符ではなく一重引用符)を使用したことが原因であると確信しています。これらのコマンドを比較してください。

_diskutil erasevolume HFS+ RAM_Disk_512MB `hdiutil attach -nomount ram://16384`
diskutil erasevolume HFS+ RAM_Disk_512MB 'hdiutil attach -nomount ram://16384'
_

彼らは本当に似ていますよね?しかし、それらは非常に異なることをします。バッククォートのあるものは、コマンドとして_hdiutil ..._を実行し、その出力をdiskutilへのパラメーターとして使用します。 2つ目は、_hdiutil ..._をリテラル文字列として扱い、thatdiskutilに渡しますが、これは目的ではありません。すべて。 2種類の引用符は非常によく似ているため(Unixには、同一のフォントを使用した本が少なくとも1冊ありました)、これは簡単です。 (そしてよくある)間違い。

$( )は基本的にバッククォートと同じことを行いますが、視覚的に そして構文的に明確 なので、代わりに使用してください。

これが実際に行うこと:コマンド_hdiutil attach -nomount ram://16384_はRAMディスクを作成し、それに対応するデバイスファイルへのパスを出力します。「/ dev/disk4」のようなもの(ただし、 $( )は、それをmainコマンドの引数として扱うため、_diskutil erasevolume HFS+ RAM_Disk_512MB /dev/disk4_のように実行され、新しくフォーマットされます(そして暗黙的にマウントされます)。作成されたRAMディスク。

もともと$( )の部分を二重引用符で囲むことを提案しましたが、これは問題を引き起こすことが判明しました。二重引用符がない場合、$( )のコマンドからの出力は、シェルによって(一種の奇妙な方法で)解析されます。これは通常、役立つよりも多くの問題を引き起こします。ただし、この場合、出力の最後に多数のスペースが含まれ、デバイスエントリのパスの一部であると通知された場合、それらはhdiutilを混乱させる可能性があります。引用符なしの解析ではスペースが削除されるため、そのように機能します。

これは、引用符で囲まれていないコマンド展開でうまくいかない傾向がある他のことから安全であるはずですが、1つの大きな警告があります:IFS(シェルの「内部フィールドセパレータ」)変数の値を台無しにした場合、完全に奇妙なことをします。

2
Gordon Davisson