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

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

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

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

Q&A

解決済

2回答

3489閲覧

command not found: mapfile

退会済みユーザー

退会済みユーザー

総合スコア0

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

パス

パス(path)はファイルシステムの場所(階層)を明示したものです。

zsh

zshは、UNIX系OSのシェルの1つです。 cshやksn系のコマンドライン編集機能も実装されたシェルです。

0グッド

0クリップ

投稿2020/03/15 23:05

編集2020/03/16 00:28

zshでシェルスクリプトを書いているのですが、mapfileコマンドが使えません。
mac標準のシェルに含まれていないのかと考え、homebrewで最新版のものをインストールしました。
ですが、which zsh$PATHではbrew経由のものが優先されているにも関わらず、zsh --versionの結果を見る限りApple謹製のものを認識しているようです。
brewでインストールしたbashも同様に、Appleのものが認識されており、readarrayコマンドが使えません。

パスの問題かと思うのですが、どうすれば良いでしょうか?

terminal

1❯ echo $PATH 2/usr/local/opt/llvm/bin:/usr/local/opt/curl/bin:/usr/local/opt/python@3.8/bin:/Users/solzard/.poetry/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin::/usr/sbin:/sbin:/opt/X11/bin 3 4~ 5❯ which zsh 6/usr/local/bin/zsh 7 8~ 9❯ whereis zsh 10/bin/zsh 11 12~ 13❯ zsh --version 14zsh 5.8 (x86_64-apple-darwin18.7.0) 15 16~ 17❯ brew info zsh 18zsh: stable 5.8 (bottled), HEAD 19UNIX shell (command interpreter) 20https://www.zsh.org/ 21/usr/local/Cellar/zsh/5.8 (1,531 files, 13.5MB) * 22 Poured from bottle on 2020-02-25 at 23:14:16 23From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/zsh.rb 24==> Dependencies 25Required: ncurses ✔, pcre ✔ 26==> Options 27--HEAD 28 Install HEAD version 29==> Analytics 30install: 75,949 (30 days), 143,477 (90 days), 520,776 (365 days) 31install-on-request: 70,817 (30 days), 135,088 (90 days), 496,084 (365 days) 32build-error: 0 (30 days) 33 34~ 35❯ which bash 36/usr/local/bin/bash 37 38~ 39❯ whereis bash 40/bin/bash 41 42~ 43❯ bash --version 44GNU bash, version 5.0.16(1)-release (x86_64-apple-darwin18.7.0) 45Copyright (C) 2019 Free Software Foundation, Inc. 46License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 47 48This is free software; you are free to change and redistribute it. 49There is NO WARRANTY, to the extent permitted by law. 50 51~ 52❯ brew info bash 53bash: stable 5.0.16 (bottled), HEAD 54Bourne-Again SHell, a UNIX command interpreter 55https://www.gnu.org/software/bash/ 56/usr/local/Cellar/bash/5.0.16 (150 files, 9.4MB) * 57 Poured from bottle on 2020-03-15 at 15:42:16 58From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/bash.rb 59==> Options 60--HEAD 61 Install HEAD version 62==> Analytics 63install: 30,645 (30 days), 71,983 (90 days), 307,568 (365 days) 64install-on-request: 24,936 (30 days), 59,140 (90 days), 250,747 (365 days) 65build-error: 0 (30 days) 66

追記 (動かないスクリプト, zshrcの関連部分, zmodloadの出力)

zsh

1#!/usr/local/bin/zsh 2urls=" 3https://www.youtube.com/watch?v=sample1 4https://www.youtube.com/watch?v=sample2 5https://www.youtube.com/watch?v=sample3 6" 7echo "$urls" 8mapfile -t parsed_urls <<< "$urls" # download.sh:8: command not found: mapfileとなる 9 10for url in "${parsed_urls[@]}"; do 11 echo "$url" 12 youtube-dl "$url" 13 printf "\n" 14done

zshrc

1... 2# enable mapfile 3zmodload zsh/mapfile 4...

terminal

1❯ zmodload 2zsh/complete 3zsh/complist 4zsh/computil 5zsh/datetime 6zsh/main 7zsh/mapfile 8zsh/parameter 9zsh/regex 10zsh/terminfo 11zsh/zle 12zsh/zleparameter 13zsh/zpty 14zsh/zutil 15

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/03/15 23:54

#!/usr/local/bin/zsh #!/usr/bin/env zsh #!/bin/zsh 残念ながら、いずれのshebangにしてもcommand not found: mapfileのままでした
退会済みユーザー

退会済みユーザー

2020/03/16 00:05

zmodload zsh/mapfile はcommand not found: mapfile https://gist.github.com/nivoc/2474615を真似て、 zmodload -a zsh/mapfile mapfile としてもmodule `zsh/mapfile' has no such feature: `b:mapfile': autoload cancelledとなります。
hoshi-takanori

2020/03/16 00:13

うーん、実は zsh 分かりません。ってか、動かないスクリプトも質問文に貼って欲しいです。
quickquip

2020/03/16 02:03

mapfileは**コマンドじゃない**ので、何をしたいのか? なぜ必要としているのか? から全部書かないと答えは付かないかと思いました。
退会済みユーザー

退会済みユーザー

2020/03/16 02:25

やりたいことそのものは、URLの羅列から1行ごとに(改行コードごとに)読み込んで配列に格納し、それぞれのURLをyoutube-dlというコマンドの引数に渡すというものです。 回答を待っている間にpythonのsubprocessを使って目的は果たせたのですが、質問内容の通り、mapfileが使えないことが気になっています。 短期的には解決したものの、もしmapfileだけでなく他のzshモジュールも使えないようなら困るなあと思い解決案を欲しています。
guest

回答2

0

最初から配列にすればいいかと。

zsh

1urls=( 2"https://www.youtube.com/watch?v=sample1" 3"https://www.youtube.com/watch?v=sample2" 4"https://www.youtube.com/watch?v=sample3" 5) 6echo "$urls" 7 8for url in "${urls[@]}" 9do 10 echo "$url" 11 youtube-dl "$url" 12 printf "\n" 13done

あるいは、urlsが所与で変更できない場合は、

zsh

1echo "$urls" | 2while read url 3do 4 echo "$url" 5 youtube-dl "$url" 6 printf "\n" 7done

投稿2020/03/16 06:09

otn

総合スコア85901

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

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

退会済みユーザー

退会済みユーザー

2020/03/16 08:26

echo "$urls" | とすると、echoの役割は出力はせずに、パイプラインに引数を渡すだけ...と考えてよいのでしょうか? また、もしそうならば、パイプラインに変数を渡すのは一般にechoの役目だと捉えてよいのでしょうか?
otn

2020/03/16 12:13

echoの役割は、パイプライン入力に引数を出力することです。 「変数の中身」をパイプラインに出力するのなら、echoでしょうね。
guest

0

ベストアンサー

まず。

zshにおけるmapfileモジュールは「カレントディレクトリのファイル名-内容を格納している(かのように振る舞う)連想配列」を提供するものなので、bashのmapfileとは関係ないものだし、質問でやりたいことにも関係しない機能です。
「質問したいこと」「やりたいこと」が「zshにおけるmapfileモジュール」とは関係なく、また、「zmodloadに関わる情報」は質問にまったく必要ないのです。
そのせいで質問の意図が分かりづらくなっています。


macOS付属のbashにビルトイン関数mapfileがないのはなぜか?

単純にmapfileがオミットされた状態のビルドのbashなのでしょう。
helpコマンドにmapfileやreadarrayがありません。


macOSで、bashのビルトイン関数mapfileを使うには?
homebrewで入るbashでhelpコマンドを実行するとmapfileやreadarrayの記載がありました。
たぶん使えるのでしょう。


zshでmapfileに相当することをしたいなら?

Parameter Expansion Flagsf でできるでしょう。

f
Split the result of the expansion at newlines. This is a shorthand for ‘ps:\n:’.

イディオムでしか理解してないのでちゃんと解説はできませんが、lines=( ${(@f)urls} )で、改行をデリミタとして文字列環境変数から配列に展開できます。

plain

1% urls=" 2https://www.youtube.com/watch?v=sample1 3https://www.youtube.com/watch?v=sample2 4https://www.youtube.com/watch?v=sample3 5" 6% lines=( ${(@f)urls} ) 7% echo ${lines[1]} 8https://www.youtube.com/watch?v=sample1 9% echo ${lines[2]} 10https://www.youtube.com/watch?v=sample2 11% echo ${lines[3]} 12https://www.youtube.com/watch?v=sample3 13% echo ${#lines} 143 15% for l in $lines; do 16echo ${l} 17done 18https://www.youtube.com/watch?v=sample1 19https://www.youtube.com/watch?v=sample2 20https://www.youtube.com/watch?v=sample3

ファイルから展開のイディオムはlines=( ${(@f)"$(< INPUT.txt)"} )
コマンド結果から展開のイディオムはlines=( ${(@f)"$(ls ~)"} )
です。

投稿2020/03/16 03:36

編集2020/03/16 03:37
quickquip

総合スコア11235

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問