質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

1045閲覧

Alpine linuxでのmkdirコマンドについて

bellcrud

総合スコア22

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2020/04/23 21:10

##Alpine Linuxでmkdirコマンドの挙動を知りたい
Dockerを使用して、Alpine Linux環境を構築して以下のコマンドをAlpine Linuxコンテナ内で実行したところ期待した結果にになりませんでした。

console

1/var/www/html/project # mkdir -p ./storage/framework/{cache, sessions, views} 2/var/www/html/project # cd storage/framework/ 3/var/www/html/project/storage/framework # ls 4testing {cache,

ディレクトリをmkdir -p ./storage/framework/{cache, sessions, views}を使用して一括でディレクトリを作成したかったんですが、{cache,というディレクトリが作成されてしまいました。
ローカルのmac osでは期待通り cache sessions viewsのディレクトリが作成されました。

##知りたいこと
Alpine Linuxとmac osでの結果がなぜ違うのか。
Alpine Linux上で一括でディレクトリを作成する方法

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

まず、x/{a,b,c} を x/a x/b x/c に展開する機能はOSの機能ではなく、 シェルの機能です。Brace Expansion と呼ばれており、echo で試すとわかります。

shell

1$ echo x/{a,b,c} 2x/a x/b x/c

この機能は、シェルの拡張機能であり、古いシェルではサポートされていません。 alpine linux はOSの軽量化のため、拡張機能がないシンプルなシェルをインストールされているのだと思います。

docker の alpine で実験すると、デフォルトのシェルではサポートされていないが、bashをインストールすると使えることがわかります。

$ docker run -it --rm alpine / # echo x/{a,b,c} x/{a,b,c} / # apk add bash fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/main/x86_64/APKINDEX.tar.gz fetch http://dl-cdn.alpinelinux.org/alpine/v3.11/community/x86_64/APKINDEX.tar.gz (1/4) Installing ncurses-terminfo-base (6.1_p20200118-r3) (2/4) Installing ncurses-libs (6.1_p20200118-r3) (3/4) Installing readline (8.0.1-r0) (4/4) Installing bash (5.0.11-r1) Executing bash-5.0.11-r1.post-install Executing busybox-1.31.1-r9.trigger OK: 8 MiB in 18 packages / # bash bash-5.0# echo x/{a,b,c} x/a x/b x/c

上記のように bash をインストールして bash を使用すれば、 alpine linux でも Brace Expansion が利用できます。

ただし、

mkdir -p ./storage/framework/{cache, sessions, views}

では、カンマ(,)の後ろに空白があるので、Mac OS の bash でも Brace Expansionは行われません。

shell

1$ echo x/{a, b, c} 2x/{a, b, c}

カンマの後ろの空白を削除してください。

投稿2020/04/23 22:18

mit0223

総合スコア3401

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

bellcrud

2020/04/24 00:31

わかりやすい確認方法も載せていただきありがとうございます! ローカルの確認時スペースを開けておりませんでした、すみません。 シェルの種類によって、機能の差があるのですね!
guest

0

回答ありがとうございます!
なるほど、シェルの違いでしたか。
ちなみに、zshではスペース区切りをしなければ動きました。
質問したコマンドの使用用途は対話的ではなく、Dockerfileに記述するコマンドでした

投稿2020/04/23 22:29

bellcrud

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2020/04/23 22:35

対話的に使いたいわけではなかったのですね。失礼しました。 Dockerfile (や、シェルスクリプトなど) に記述するコマンドは、なるべく特定のシェルの機能に依存しないように書くのがいいと個人的には思っております。
bellcrud

2020/04/24 00:26

確かに、なるべく特定のシェルの機能に依存しないように書くのがいいですね! その辺の考慮していなかったので、勉強になりました!
退会済みユーザー

退会済みユーザー

2020/04/24 01:36

> Dockerfile (や、シェルスクリプトなど) に記述するコマンドは、なるべく特定のシェルの機能に依存しないように書くのがいいと個人的には思っております。 逆じゃないですかね? Docker の場合、使用されるものが確定できるので、「その環境で動作が確実な方法」で記述するのが適切だと思います。
bellcrud

2020/04/24 04:33

コメントありがとうございます。 Dockerなら環境は確定されていますね。 どの環境でも動くものを使うよりも、その環境にあった適切なもの使用するようにした方が良いということですね。 その辺は経験を溜めて環境にあったコマンドを選べるようにしたいですね。
guest

0

mkdir ではなく、シェルの違いです。(他にも、~ や * を展開するのもシェルの機能です。)

./storage/framework/{cache, sessions, views}./storage/framework/cache ./storage/framework/sessions ./storage/framework/views と展開するのは fish の機能のようですね。

他のシェルの場合、bash は単純にスペースで区切って ./storage/framework/{cache, sessions, views} になります。また zsh では parse error near `}' となりました。

docker の中にも fish を入れればうまくいくと思いますが、そもそも docker は対話的に使うものなのだろうか? (また、対話的に使うならなぜ alpine?) という疑問はありますね。

投稿2020/04/23 21:54

編集2020/04/23 21:56
hoshi-takanori

総合スコア7901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問