[Linux环境]写脚本的语言怎么选

来点信仰 用guile scheme,gnu官方指定代言语言。

我在linux环境下写脚本的模式是在repl里跑,然后记录成文件,我比较喜欢用ruby的pry,python的话,jupyter notebook也不错,就是重了点

脚本不是正经代码,我只用他执行一些命令和简单处理下数据,比如数据库初始化,计算csv数据这种非常非常低频的操作,存成文件只是为了留个档案,无论是python,ruby还是bash都完全ok的,真的不用太在意语言,够用就行

嗯嗯 :slightly_smiling_face:

当然是 Haskell 啦w

额,scsh我从源码编译好了,就是不知道怎么启动啊 :joy:

scsh好久不更新啊。bash第一选择,python作为备胎写脚本和刷leetcode悄悄用(语法虽然极其简单直觉,但python用户喜欢证明他们自己不简单)

确实,scsh好像发霉了,6年前就断更了
但是这个scsh到底怎么启动啊 :slightly_smiling_face:

跟随主流就好了…

如果要用不同的shell解析,脚本开头声明部分就可以写呀,比如:

#!/usr/bin/bash
#!/usr/bin/ksh
#!/usr/bin/env python

然后用bash ksh python之类的放在脚本之前就可以了,比如:

[[email protected] ~]$ bash test.sh

solaris, hp-ux, aix等用过 cshkshbash 等,linuxshell 首选 bash (因为系统自带),简单的事情能用shell就用shell,如果只是找个脚本语言的话,个人还是首选 python,反正常规的事情都能干。

用guix :slightly_smiling_face:

guix environment --ad-hoc scsh
1 个赞

bash的语法确实很不好记忆。各有用处吧,毕竟确实简洁。非要用bash做大项目就怪不得bash了。

熟练使用bash的难点并不在语法本身,bash的语法其实没有多少。

导致感觉困难的地方来自与两个方面:

一个是linux本身的很多机制,例如环境的继承关系,变量的作用域,管道的概念及灵活运用

第二个来自于,仅仅学会bash是远远不够的,bash的能力是把各个独立的程序组织起来,也就以为这你必须还要熟练掌握各个独立程序的用法,例如:find, grep, sed, awk, ls, curl, wget, head, top, nc, ffmpeg, vlc convert, …换句话说,你掌握了那些命令,你的bash程序才能够多强大。

1 个赞

# Using Clojure in Command Line with Babashka

1 个赞

Bash本身也有坑,比如管道两边的命令是放在子shell中运行的,坑了我很多次了。

还有字符串变量加不加引号的问题,

还有PATH、TMOUT这类环境变量的问题

隐藏的回车的问题

命名管道的死锁问题

3 个赞

如果被这些问题困扰,说明对shell的机制了解还不够,对语法还不够熟练。

多用,多练,熟悉之后,你会本能的避开这些“坑”。

再多说句不中听的,哪个计算机语言没有坑呢?那些坑之所以还能成为坑,只是水平不够而已。

那这个问题来举例,如果总觉得这是个坑,那么说明对管道的运行机制还没有真正的理解,没哟搞清楚管道上各个进程之间的stdout/stdin/stderr是如何接起来的,没有搞清楚管道上的各个进程是何时开始运行,何时结束运行,何时会被祖塞都没有清晰的认识。

如果把上面这几个问题都搞清楚了,这个“坑”不仅不是“坑”,而且是一个非常强大的机制

这个跟管道没关系,是Bash自己把命令放在子shell中运行导致的。 同样的代码在ksh中是没有问题的。

当然就像你说的,这种东西踩过一次也就会避开了,甚至会加以利用。但是对于初学者来说这个机制是很反直觉的,也是很难排查的。

2 个赞

另外,我至今都不知道bash调试的正确姿势到底是什么…

bash -x

简单点的任务用 bash/zsh/sed/gawk/miller 解决,复杂点的用 Perl,如果想写得舒服点用 Ruby