V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  wxf666  ›  全部回复第 17 页 / 共 27 页
回复总数  529
1 ... 13  14  15  16  17  18  19  20  21  22 ... 27  
@aloxaf 算交流吧,都一起骂了 bash 的难用的地方,@Jirajine 也介绍了 elvish 优越之处,我也有自己的保留意见


感觉我还能接受新鲜事物。不写脚本的话,尝试换下 shell 也是可以的(反正就自己用而已。好用就赚,难用就换~)


听你这么一说,会不会 @Jirajine 说的『 bash 的 glob 复杂』,其实是『 zsh 的 glob 复杂』的意思。。

原本我思来想去,即使算上 extended glob ,bash 的 glob 也和复杂沾不上边儿才对。。


elvish 不也是按照 \n 切割 (...) 嘛。。

反正被折磨多后,一般都用 "..." 包裹住就是了(然而还有个 ! 。。)
2022-09-06 16:59:45 +08:00
回复了 simonlu9 创建的主题 程序员 mysql 怎么保证每次查出来的排名是一致的
销售额都等于 0 时,排名不应该是一样的嘛。。

不考虑使用连 SQLite 都支持的窗口函数 rank() OVER(...) 嘛?
@Jirajine

> 变量名拼写错误会执行外部代码

🤔我还没怎么用过 xonsh ,也不知这种情况严不严重


> 脚本里有一大堆 ad-hoc 的 parse 和拼接字符串的代码,难写难读易错还不安全,远远不如直接操作结构化数据

✔️写脚本我就不用 bash 这坑爹玩意儿了,换个 Python 不香嘛。。


> 正则

🤔我还是坚持:交互式 shell 需要功能强大的正则


> quoting hell 指一次 evaluation 的结果再次被另一种相同或不同的规则 evaluate ,所以需要同时为多种规则 quoting 和转义

✔️噢,这种啊,确实绕脑袋

❓elvish 是咋解决的?


> glob

🔁我还是不知道你说的,bash 的 glob 比 elvish 复杂,是啥意思。。❓可以举些例子嘛?


> 这就是 IFS 和 word splitting 糟糕的地方,数据(变量值)影响语义,在代码的不同地方处理、存储、复制、传递含空格字符串,并保证结果正确是非常麻烦且恶心的

🔁IFS=$'\n' 后,❓不就可以像 elvish 那样,不用处理啥空格了嘛?

需要一个参数时:"$s"、"$(...)"

需要每行作为一个参数时:$s 、$(...)


> bash 的 array 不是一般的难用

✔️知道 bash 的 array 坑多。反正我一般绕过那些奇奇怪怪的用法,老老实实 "${arr[@]}" 之类的。。

我记得好像 ${arr[*]} 还是 "${arr[*]}" 来着,和 $* "$*" 有不同。。
2022-09-06 11:38:22 +08:00
回复了 listen2wind 创建的主题 MySQL 请教一个问题: mysql 中使用 group by 如何获取最新一条数据?
https://dev.mysql.com/doc/refman/8.0/en/example-maximum-column-group-row.html

文中说了 子查询、相关子查询、自连接、窗口函数 4 种方法
@Jirajine

> 充其量只能算是类似 ipython 的 ui

无所谓这些概念。🔁还是希望你能举些 xonsh 『语义严重不一致』的例子❓


> 但 bash 是语言内部都没有结构化数据,你就得一直拿字符串糊过来糊过去

✔️大部分同意。但如果只是 json 的话,jq 这个工具大部分时候还是足够使用的:

ip --json addr | jq -r '.[] | .ifname + " " + .addr_info[0].local'


> 正则搞得太“高级”,不符合 do one thing and do it well 的理念

我觉得还是『匹配某句法规则的字符串』范畴,且允许描述得更好了,还是符合理念的

换句话说,❓为何 go/rust 的正则库,就是按照“do one thing and do it well”理念设计的、shell 正则库的巅峰呢?

❓不能是 perl 的 pcre 嘛?


> 这些功能自己写代码实现可读性和心智负担都更好

🤔我不觉得我会自己实现 \p{Han}、a*?、a*+、(?>)、(?<!),心智负担很大。。

🤔也不觉得 [\u4e00-\u9fa5] 会比 \p{Han} 可读性好(其实前者只是后者的小子集,真实情况前者会很长)


> 这也是 go/rust/cpp 等语言的正则库只实现一部分特性的原因

🤔『线性时间复杂度』等特点,是高速应用的需求,但不该是交互式 shell 的


> quoting hell 了解一下,如果转义字符也需要转义。。

🔁再次重复:

'\' 中的转义字符,就是它自己,不是转义了 '。若要转义 ':

bash:'left'\''right'

elvish:'left''right'

实在不行,还有 Here Doc 嘛:

cat <<'EOF'
 !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
EOF


> elvish 可没有 extended glob ,特殊字符也很少

bash 默认也不开启 extended glob 。。

❓要不你举些 bash 的 glob 比 elvish 复杂的例子出来吧


> a=$(ls) ; file $a # 这里是写$a 还是"$a"呢?

IFS=$'\n'

file $(ls)

❓突然想到,这样是不是就和 elvish 的 (...) 等价了?


> 日常使用结构化数据非常有用,尤其是数组

✔️确实,这些也应该是 shell 的基础设施。bash 能用,但用起来很累:

readarray -t arr < <(ls)

file "${arr[@]}"
@Jirajine 用了些 emoji 快速表明态度


> parser 太随意,一部分传给 python ,一部分传给 bash ,语义严重不一致。

我看它是,但凡 命令 和 参数 中,有出现未定义的标识符,就当作外部命令处理

感觉也说得过去?❓能举些你觉得容易出错的例子吗?


> 还是因为缺乏结构化数据类型,只能一边 parse 字符串,一边拼接出特定的字符串给别的程序 parse

elvish 能直接传递 list map 给其他命令?从其他命令接收来的 str ,不 parse ,咋变成 list map 的?

❓你是说 xml json 序列化、反序列化 这些库吗?


> go/rust 的正则库大差不差,功能完全够了吧

相比 pcre C# 而言,还差很多。😑你这样说,显得人家在不务正业。。


> 其他“高级特性”实现的话就做不到线性时间复杂度了

写应用确实速度快(是因为用 DFA 实现吗?)

但在 交互式 shell 中,更需要功能丰富啊

正则库不支持,❓不就要苦逼地写代码,自己实现相同逻辑了么。。


> 关键是它标准库有常用字符串和正则函数,这些 bash 根本实现不了

✔️确实,字符串处理是 bash 的弱项。这应该也属于 shell 的基础设施的

正则匹配的话,还是有个 [[ $s =~ regex ]] 可用的


> 一堆不同语言的转义,考虑的太多

🔁再次重复:

bash 的 'pattern' 足够好了,连 \ 都是本身的意思:'\'

最多只需考虑 ' ( elvish 也需写成 'str1''str2')


> glob 和正则共用不少符号但语义又不一样,增加心智负担。elvish 的 glob 简单很多

🔁再次重复:

elvish 的 glob 也用了 ? * ** {} ?[],❓语义不是也和正则不同吗?

❓elvish 的 glob 也比 bash 的复杂呀:

bash:*.[ch]、[a-z].go

elvish:*.?[set:ch]、?[range:a-z].go


> bash 几乎总是需要 quoting ,如果处理含空格字符串的话,空格有时候作为分隔符,有时候又不是,还有 IFS ,处理起来难写难用且易错。

需要作为一个参数:"$s"

需要 word splitting:$s

❓足以应付大多数场景了吧?或者你举些例子?


> bash 的 数组和 map ……不能表达结构化数据

✔️确实,但对于日常交互式使用而言,一般也足够了。再复杂,也适合上脚本了


> 默认按换行符 split 。如果不希望这种转换可以用 slurp

🤔还行

bash 作为一个参数:"$s"、"$(...)"

elvish 作为一个参数:$s 、(... | slurp)

❓还是感觉 bash 整体代价较低?

❓elvish 默认是按 \n 切割的。如何像 bash 那样,按 IFS 来切割 (...) 呢?
2022-09-05 17:57:44 +08:00
回复了 RayGZJ 创建的主题 Linux 不限 shell 类型的情况下,用 shell 脚本可以实现哪些骚操作?
这些是很普通的操作吧。。

Shell 就是个胶水语言,能快速整合使用各种命令就好
@Jirajine

> xonsh 就是个玩具

xonsh 大概有啥不足呢?我只匆匆看过一眼,没用过


> rename 用 $1 $2 来引用 capture group ,是自己的语言,不是 shell 的

用的是 pcre 吧。sed 也类似(但用的是 posix bre ere )

他们作为字符串传递,本来就和 shell 没啥关系呀

胶水语言就是这样咯,用最基础的 shell 语法,来描述要用人家的啥东西。。

我觉得你那个 elvish 应该也类似,golang 的正则库支持特性不多( regex101 说的)

想用一些高级特性(如 \p{Han}、a*?、a*+、(?>...)、(?<=...)、(?R)、(?(DEFINE)...) 等),就要导入其他库使用,甚至有自己的语法,不和 golang 未来的正则库兼容

这时候会不会就有人说 elvish 号称一致性,实际有多套正则语法,互不兼容,心智负担……


> 用 shell 构建另一个语言的字符串,你得考虑 shell 的转义(单引号或$符号)、dsl 的转义( /符号)、正则特殊字符的转义

shell 的转义:'$p $a $t \t \e \r \n' 都没问题啊(除了有 ' 字符时,需要用 'aaa'\''bbb' 表示)

dsl 的转义:那就看你那个工具的设计好不好咯。sed perl rename 可以用其他符号的:s|http://|https://|

正则特殊字符的转义:这个就是正则的问题了。golang 应该一样要面对


> glob 又是一套类似正则,但又不同的匹配语言

bash 的 glob ,也就 [] ? * {} 之类几个简单的语法吧,比正则简单得多

另外,我瞅了一眼,elvish 也是另外一套语法,且有点繁杂。。

bash:*.[ch]、[a-z].go

elvish:*.?[set:ch]、?[range:a-z].go


> 引用变量总是需要 quoting 。用 shell 处理包含空格的字符串简直是 nightmare

Emm... "$s" 不至于是 nightmare 吧。。


> 你要传多个参数,直接用 list 就行了

其实 bash 也支持 数组 和 哈希 呀。传多个参数,也可以直接用 数组:ls "${array[@]}"


> 你要传多个参数,直接用 list 就行了

我好奇 elvish 如何将 一个命令的返回值,split 成多个参数,传递给另一命令?如:

apt purge $(dpkg -l | grep ^rc | awk '{print $2}')
2022-09-05 11:13:45 +08:00
回复了 particlec 创建的主题 问与答 遇到一个柯里化的问题,感到困惑,请求大佬解惑
@particlec curryingAdds.length 换成 arguments.length
@Jirajine

> 用 elvish ,……,也比 Python 方便

直接和 Python 比不公平吧。。

后者定位是脚本语言,你前者拿来当交互式 shell 用的。。

Python 也有个 shell 实现,xonsh ,你试过吗?感觉咋样?


> 长正则,可读性差,有人看不懂

看各人咯,不想写正则,多半也是自己写代码,模拟实现了正则的逻辑出来

可能写的多了后,厌烦了,也会转正则那边去了


> rename 自己又有一种 dsl 语言

你是说很多命令有自己风格的正则嘛?

确实是个问题。但好像也就几种风格:posix bre ere 、pcre

\d 不支持就试试 [0-9] 或 [[:digit:]] 呗。反正支持的正则特性都差不多


> shell rename 转义,glob

shell 里用 'pattern' 来表达 rename 的正则,也没啥麻烦吧

glob ?*.jpg ?有啥问题么。。


> word splitting 可不是简短,是历史包袱

我觉得 bash 为实现下列功能,整体花费的代价很小。elvish 是如何实现的?

1. 变量 /subshell 捕获,被 split 成多个参数( bash:$s ,$(xxx))

2. 被作为一个参数传递( bash:"str: $s","captured: $(xxx)")


> man zshexpn 看一看特殊语法,字符串处理有多麻烦

我只用过 bash ,没用过 zsh 。bash 支持的字符串处理确实不多


> PowerShell 才是故意搞得冗长、难以输入并美其名曰“可读性”的

反正那人坚持说 powershell 因为冗长而强大。bash 简短易出错,容易友尽、吃牢饭等。。

另一个人说 shell 命令简短,容易记混 ln ls ll du dd df ……
@Jirajine 另外,你那个示例的逻辑,可以写成:rename 's/[^\dxX]//g; s/$/.jpg/' *


我觉得,交互式下的 shell ,简短快捷,还是很重要的吧

word splitting 、特殊语法 也是为这个目的服务的

不搞这些,就不可避免地会写长


简短 和 美观,感觉不可兼得,就看个人喜好了

反正交互式下,我是愿意阅读 bash 规则,牺牲一定可读性,来换取输入时的便捷的


就好比有人会放弃易读的拼音,练习五笔,去换取快捷打字一样(我折中一下,学了个双拼。。)
@Jirajine 我感觉你那个示例。。我更愿意写一行 rename + 正则。。
@Jirajine 这个为啥又比 bash 顺手了?

上次有人说 powershell (在交互式下)比 bash 强大,是因为参数显式,严谨安全。。
也对,名字里没有 0-9 x X ,直接 's/^.*?(\d+[\dxX]).*?(\.[^.]+)$/$1$2/' 就好
这样?

rename -n -v 's/^\s*.*?\s*(\d+[\dxX])\s*.*?(\.[^.]+)$/$1$2/' *

一样,确定没问题就去掉 -n 参数
2022-09-03 23:18:41 +08:00
回复了 automation2022 创建的主题 Python 自动化抓取 stackoverflow 问题列表
@BeautifulSoap 哇,第一次知道 StackOverflow 居然提供全站数据下载。。好开放啊

@Nillouise 有现成的大型数据库你可以用了
2022-09-03 15:33:41 +08:00
回复了 pepi 创建的主题 程序员 PowerShell 这种强大的命令行工具,为什么使用的人很少?
@documentzhangx66 你都说那个风险可能导致坐牢,开个 IDE 写个几行几十行 Python Ruby 啥的,代价也不算高吧
2022-09-02 19:55:48 +08:00
回复了 Messiahhh 创建的主题 程序员 分享一个命令行下载轻小说的工具
做成了个命令行客户端的样子
2022-09-02 18:42:12 +08:00
回复了 974879409 创建的主题 程序员 四年前端,聊聊这一行的体会...
@kop1989smurf 你是说,核心是“上级是如何思考出这个安排的”?还是啥?
1 ... 13  14  15  16  17  18  19  20  21  22 ... 27  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5204 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 38ms · UTC 03:25 · PVG 11:25 · LAX 20:25 · JFK 23:25
Developed with CodeLauncher
♥ Do have faith in what you're doing.