zsh问题记录
Contents
#前言
之前自己写过一些定时脚本,比如整理照片啊、加密备份啥的,之前一直没有把cron
的运行日志记录下来,最近记录之后发现写的有好多问题,之后有关zsh
的问题也会在这里进行记录总结。
#comm
在进行文件比对的时候,有可能因为文件结尾是CRLF
导致每一行都不一样,这时候需要统一换行符。
简单的方式是用vim
打开文件,然后:
1 | :set ff=unix |
#零填充
1 | [2022/10/14 16:06:27] mbp ➜ ~ printf "%02d" 2 |
#grep
1 | cat data.txt | grep "[9]$" |
筛选所有9
结尾的行
#纳秒/微秒
zsh 本身的 date 不支持微秒
替代工具是gdate
1 | [2022/10/13 11:21:12] mbp ➜ ~ gdate +%s%N |
1 | # 安装gdate |
使用场景是,脚本的 token 生成等。
1 | # 微秒在纳秒的基础上除法 |
#列表数据/数组
理论上空格可以作为列表分隔的元素,所以最简单的使用方法是:
1 | for i in 1 2 3; do |
也可以用参数的形式:
1 | a=(1 2 3) |
#向列表添加数据
1 | qs=('aaaa' 'bbbb') |
#反引号
被反引号`包括的内容会作为命令执行,然后把结果作为参数传给变量
1 | cur_sec=`date '+%s'` |
#no matches found
在用通配符*
的时候,有时候如果没有文件,就会报错:
1 | $ mv /Users/onns/Desktop/temp/* ${another_dir} |
原因改天再补吧!
#解决方法
解决方法是在运行脚本之前先运行一下:
1 | setopt +o nomatch |
但是必须要写在脚本文件里,我写在.zshrc
里结果没用,我也不知道为什么,如果有人知道可以告知一下。
#相关链接
#tar: Removing leading ‘/’ from member names
这个就比较好解决了,一搜就有,没想到tar
默认是用相对地址的= =
不过我比较好奇的是,为什么在压缩过程的输出是输出到stderr
里而不是stdout
里,也是TODO
,改日再说。
#解决方法
添加-P
参数:
1 | tar -zcvPf - "${imgdir}" | openssl des3 -salt -k $img_password | dd of=${bakdir}img-${now_date}-${now_time}.bak |
#相关链接
- How to overcome tar: Removing leading `/’ from member names [duplicate]
- tar: Removing leading `/’ from member names
#Prompt
1 | PROMPT='%F{green}[%*] %n@%m%f %F{blue}%~%f $ ' |
#相关链接
#默认值
1 | FOO="${VARIABLE:-default}" |
:-
后加默认值
#for 循环
1 | for ((c = 1; c <= page; c++)); do |
在 (())
里面写变量的时候,不需要加$
。
#screen 乱码
创建窗口的时候用:
1 | screen -U -S onns |
重连的时候用:
1 | screen -U -r pid |
不知道为什么用配置文件的方式没生效= =
#时间相关
显示今天是今年的第几天:
1 | [2022/12/06 17:06:25] mbp ➜ ~ gdate +%j |
#curl 相关
curl 的-G
选项代表 get,否则默认 post
1 | curl -G --data-urlencode "key=value" url |
可以在 shell 中输入需要 urlencode 的内容,比如 json 输入的时候
如果用了--data-urlencode
,再在 url 里加参数会不生效,必须全部用这个参数指示
#对文件进行拆分
1 | $ split -h |
最常用的是按照行号分割:
1 | split -l 200 order.csv oa. |
#seq
可以生成序号的命令:
1 | for i in $(seq 1 60) |
#查找内容前后数据
1 | $ grep --help |
-A 10
显示查找内容+后面
的 10 行。
-B 10
显示查找内容+前面
的 10 行。
-C 10
显示查找内容+前面和后面
的 10 行。
#判断文件是否存在
#从数据中选取指定列
#iterm2 分屏
-
cmd + d
垂直分屏 -
cmd + shift + d
水平分屏 -
cmd + option/alt + 方向键
切换分屏
#ffmpeg 相关
1 | # 提取视频首帧 |
#TODO
- [ ]
setopt +o nomatch
的作用 - [ ]
tar
输出问题