関数型のような Unix シェルはありますか?

関数型のような Unix シェルはありますか?

私は関数型プログラミングに関しては(本当に)初心者です(実際、Python を使用してしか触れたことがありません)が、シェル環境でのリスト集約型タスクには良いアプローチのようです。

私は次のようなことをしたいと思っています:

$ [ git clone $host/$repo for repo in repo1 repo2 repo3 ]

このような機能を備えた Unix シェルはありますか? または、Python 内から簡単にシェルにアクセスできるようにする機能 (コマンド、env/vars、readline など) があるかもしれません (bash の代わりに Python の対話型インタープリターを使用するというアイデアです)。

編集:

比較の例で説明しましょう。次のようなリストがあるとします。ディレクトリ/ファイル:

$ FILES=( build/project.rpm build/project.src.rpm )

そして、私は本当に簡単なタスクを実行したいのです。すべてのファイルをディストリビューション/そして、それをシステムにインストールします (これはビルド プロセスの一部です)。

bash を使用する場合:

$ cp ${files[*]} dist/
$ cd dist && rpm -Uvh $(for f in ${files[*]}; do basename $f; done))

「Pythonic シェル」アプローチを使用する (注意: これは架空のコードです):

$ cp [ os.path.join('dist', os.path.basename(file)) FILES 内のファイルに対して 'dist'

違いがわかりますか? それが私が言っていることです。なぜ、このような機能が組み込まれたシェルをまだ終了できないのでしょうか? ファイルのリスト、PID のリスト、すべてのリストなど、非常に一般的なタスクであるにもかかわらず、シェルでリストを処理するのは本当に面倒です。

そして、本当に重要な点は、誰もがすでに知っている構文/ツール/機能、つまり sh と python を使用することです。

IPython は良い方向に進んでいるように見えますが、肥大化しています。変数名が '$' で始まる場合はこれを実行し、'$$' の場合はこれを実行します。構文は「自然」ではないため、多くのルールと「回避策」があります ( [ ln.upper() for ln in !ls ] --> 構文エラー)

答え1

ありますスキームシェルそれはおそらくあなたが探しているものに非常に近いでしょう。私は自分では使ったことがありません。

アップデート :

インストールして自分で試してみました。scshは、本当に便利な対話型シェルというよりは、対話型Schemeインタープリタやスクリプト言語のようです。

echo hello

構文は次のようになります

(run (echo hello))

それを見つけるのに数分もグーグル検索を要しました。最初の例はここは:

gunzip < paper.tex.gz | detex | spell | lpr -Ppulp &

これは次のように翻訳されます:

(& (| (gunzip) (detex) (spell) (lpr -Ppulp)) (< paper.tex.gz))

しかし、それはどのように運営するかを教えてくれません単純シェルコマンド。

このFAQエントリ言う:

4.6 scsh を対話型シェルとして使用できますか?

技術的には可能です。単に「scsh」コマンドを実行すると、すべての scsh 機能が使用可能な Scheme 48 セッションに入ります。ただし、これは対話型作業には明らかに適していません。コマンドライン編集、コマンドライン履歴、ファイル名/関数名の補完、簡潔な構文などはありません。

これらの問題を軽減するために、Martin Gasbichler と Eric Knauel は、scsh 上で実行され、快適な対話型環境を提供する Commander S を作成しました。その斬新な機能の 1 つは、多くの Unix コマンドの出力を理解でき、ユーザーがそれを便利な方法で参照および操作できることです。Commander S の詳細については、次の論文を参照してください。 http://www.deinprogramm.de/scheme-2005/05-knauel/05-knauel.pdf Commander S を入手してインストールする方法については、scsh Web サイトから入手できます。http://www.scsh.net/resources/commander-s.html

おそらくそれが本当の答えなのでしょう。

答え2

質問に直接答えるカテゴリーとしては、ESシェルこれは、Bash や Zsh などの機能的な代替として意図されています。

次に、より機能的な標準シェルの作成を支援するカテゴリでは、パイプミル テクニックの学習を検討してください。

who | while read username 
do
  cat <<EOF | grep $username
nic
mark
norman
keith
EOF
done | while read username
do
  echo "you have an answer on superuser.com" | mail -s "well done" $username
done

最初の while ループは関数型keep(ループから出てくる null 以外の値のみを渡す) であり、2 番目はeach(副作用のみをマップする) です。

これはシェルの fp を大幅に向上させます。

シェルでは、より fp スタイルで多くのことを表現できますが、思ったほど簡単ではありません。私たち全員がシェルを非常に頻繁に使用しているにもかかわらず、より優れたシェルを作成することにあまり関心がないようです。

答え3

標準の Bourne スタイルのシェル ( sh、、など) では、すでに次の操作が可能ですbashksh

for repo in repo1 repo2 repo3 ; do git clone $host/$repo ; done

do(との前にはセミコロンが必要であることに注意してくださいdone。) さらに、bashやその他のシェルでは、$repoがコマンド内に 1 回だけ出現する場合は、次のように記述できます。

git clone $host/{repo1,repo2,repo3}

答え4

Scheme Shell、scsh は本当に優れています。

Keith Thompson が指摘しているように、対話型シェルとしては役に立ちません (Commander S は興味深い実験のように見えますが)。その代わりに、POSIX バインディングをすべて備えていることが役に立つコンテキスト (他の Unix アプリケーションを呼び出す場合など) では、優れたプログラミング言語です。数十行以上のシェル スクリプトは、いつもどれだけきれいに書いても、ハックのように感じますsh。対照的に、scsh を使用して重要なプログラムを作成することを妨げるものは何もありません。

scsh はあまりコンパクトではありません (簡潔さは sh ファミリー言語の長所であり短所でもあります) が、強力です。

scsh は、大小のタスクに便利で実用的であるため、Scheme を理解するのに良い方法です (ただし、それが目的であれば、最近では Racket に直接進むほうがよいでしょう)。

関数型言語の利点は、リストを多用するタスクだけに限ったことではありません (ただし、歴史的に見て、関数型言語はデータ構造としてリストを好む傾向があります)。正しい理解をすれば、関数型言語はプログラムを書くための非常に堅牢な方法です。

sh スタイルのシェルが機能的であるという意味は存在せず、Python が機能的であると言えるのは、ラムダ関数があるという限界的な意味だけです。

関連情報