duangsuse::Echo
#learn #bash with #tool 入门+优质冷知识 😋 图为 asciinema.org/explore 。没有 #linux 的极客可打开 WebVM.io Linux Deploy; (Mac)Git Bash; winetricks; screenfetch 甚至 bashttpd; pacman/OpenRC init 基于bash shell 是类似 Windows.ps1 但使用纯文本或行IO的脚本编程语言。 每当你看见awk|sed|grep ,那就是在 #sql sele…
— Linux与命令行
"外壳"提供了调用软件的人机接口。在 kernel.org 已对内存cpu分时分址复用、解码/dev/sdXY 分区, /sys/内设外设+网
.bashrc 和 etc/XXX.d/ 以run-command而非json注册表的方式配置设置,这既先进又落后。 rc的灵活性远优于yml,但bash的无类型,单全局表 将其化神奇😅为腐朽了(毕竟1971年老古董)
您的终端通过 ANSI 清屏=
->py termios 如何进入非阻塞(游戏按键)模式?编写 key echo demo
->表格出所有ANSI escape,然后函数化为
— 进程管理
^C终止 ^Z挂起到jobs
#记录3态时间的后2Sum是CPU占用率 ,sys时间较高=IO密集型
jobs -l 查看pid; fg bg 继续任务$!, kill -9 $(pidof bash) 杀死
— 命令的组合 &; >< 与括号展开
&>fp 即
表达式if\else
for,case在文尾。 罕见于urls|xargs cat
hi 3 HiH 3 01 03 05 07 09 goodboy badboy..
{} 允许并列,嵌套和正择 🥰
使用可嵌套的 $() 取代`` 除了可以调用文字替换API, 还能提升组合力
不过sh系都支持多行字符串
可以手动
— 目录管理
mkdir -p 目录/树
echo>>a.txt 记录
rm -rf * 清空$(dirs)
^xg #查看符合正择的文件
cp;mv 复制和移动到arg-1即 $_
chmod {+x,755} 设置可执行
set -s noglob 以禁用*正择
可深度遍历,匹配多个斜杠。正则[0-9]仍有效,但'?' 变成了(.), [^\d]* 成了
替换文件扩展名(thunar -B ,不得不说单字符很脑残,何况bash连对象键值都停留在get/set函数名) https://wangdoc.com/bash/string#搜索和替换
a mp4
自至剪贴板
练习:封装这些功能为函数或basename式CLI工具,加什么参数你看着办,这幼儿园Perl我看着就难受
— sh变量
不支持str和float算式,支持?:
— 权限
您的系统通过chown和setcap来管理特权,所有文件通过 umask: ugo(user grp other)三权分立,一般为 644, 755(=rwxrxrx 对于目录x允许进入)
6(rw-)即是位旗 0b100+0b10+0;
特别地,wheel 用户组(类似win/droid的SYSTEM) 可使用/bin/sudo 来鉴权到sudo的所有者root。为了防止 LD_PRELOAD注入应使用 visudo 修改配置
— 古怪的语法
先前学过java的大佬,会觉得 if-fi case-esac for-done 比Lua和Matlab还啰嗦,这是因为bash采取了shlex 而且和TeX一样不懂变通
bash 区分命令和计算的$()也很含糊,但在pwsh上都是 ()
"外壳"提供了调用软件的人机接口。在 kernel.org 已对内存cpu分时分址复用、解码/dev/sdXY 分区, /sys/内设外设+网
ls {/proc,/sys/class}/net
的基础上。这是DOS.COM 所不具有的.bashrc 和 etc/XXX.d/ 以run-command而非json注册表的方式配置设置,这既先进又落后。 rc的灵活性远优于yml,但bash的无类型,单全局表 将其化神奇😅为腐朽了(毕竟1971年老古董)
pacaur -S xonsh elvish pwsh
拥有更合理的弱类型API您的终端通过 ANSI 清屏=
printf '\e[2J\e[14t'
来控制显示效果,但对于TUI应用..有少数stdio管道不能实现的接口, https://docs.python.org/zh-cn/2/library/termios.html .iospeed.O_NONBLOCK->py termios 如何进入非阻塞(游戏按键)模式?编写 key echo demo
->表格出所有ANSI escape,然后函数化为
clear=lambda: CSI('2J'); ...
bash连接到的tty服务器=$(fuser -s $(readlink /proc/$$/fd/0))
,如 xfce4-terminal;ssh;tmux— 进程管理
^C终止 ^Z挂起到jobs
htop; powertop
TUI监视器yes sir|tee just-like.dd
nohup zenity --entry --text="请输入您的姓名:" &
tail -f nohup.out
time sleep 1
#记录3态时间的后2Sum是CPU占用率 ,sys时间较高=IO密集型
jobs -l 查看pid; fg bg 继续任务$!, kill -9 $(pidof bash) 杀死
— 命令的组合 &; >< 与括号展开
{cat,echo}|grep #不要这样做! 使用'<'或arg1输入文件常量,'>>', &>/dev/null 赋值文件。尽量不要使用 >
&>fp 即
1>fp 2>&1
; freopen了两个换行流文件(stdbuf -oL),就像 import subprocess.Popen(stdin=-1)
它可被读写less -f /dev/stdin &sleep 1 &&echo>>/proc/$(pidof less)/fd/0 hi您使用lsof即可知道进程打开了什么(网络)文件
lsof /tmp/; ss; strace -etrace=openat,getdents64,connect ls
表达式if\else
zenity --question --text="确认要执行吗?" && echo "您已确认执行。" || echo "您取消了执行。"
test -f nohup.out &&wc $_
for,case在文尾。 罕见于urls|xargs cat
a=hih;echo ${a:0:2} ${#a} ${a//h/H} $((10/3)) {01..9..2} {good,bad}boy {z..a}
hi 3 HiH 3 01 03 05 07 09 goodboy badboy..
{} 允许并列,嵌套和正择 🥰
使用可嵌套的 $() 取代`` 除了可以调用文字替换API, 还能提升组合力
diff <(echo hello world) <(echo hello bar)
less <<<Good #配合 ruby -p; node -e 胶水使用
JS=$(cat <<OK
heredoc,就像""仍能内插${} ''
OK
)
不过sh系都支持多行字符串
可以手动
tmp=$(mktemp); trap 'rm -f "$tmp"' EXIT
— 目录管理
文件夹名/拖放
转到。不要用cd那个太古板了mkdir -p 目录/树
ls -lh; tree; du -h
读目录,计算df大小echo>>a.txt 记录
rm -rf * 清空$(dirs)
^xg #查看符合正择的文件
cp;mv 复制和移动到arg-1即 $_
chmod {+x,755} 设置可执行
set -s noglob 以禁用*正择
可深度遍历,匹配多个斜杠。正则[0-9]仍有效,但'?' 变成了(.), [^\d]* 成了
*[![:digit:]]
,从find和sed的使用来看😅bash的RegExp是🤡ls !(*.mp4)
echo **/*.mp4
替换文件扩展名(thunar -B ,不得不说单字符很脑残,何况bash连对象键值都停留在get/set函数名) https://wangdoc.com/bash/string#搜索和替换
fp=a.x.mp4; echo ${fp%.*} ${fp##*.}a.x mp4
echo ${fp/.*/} ${fp/*./}
a mp4
for fp in *; do [[ $fp =~ \.png$ ]]&&ls "$fp"; done
自至剪贴板
a=$(xclip -selection clipboard -o); base64 <<<$a|xclip -selection clipboard
练习:封装这些功能为函数或basename式CLI工具,加什么参数你看着办,这幼儿园Perl我看着就难受
— sh变量
不支持str和float算式,支持?:
pargs() { echo "$@"; }
pargs x y #x y. 不像argv它不含$0
echo $PS{1,2} #为什么大佬教你要 "$var"呢?试试在文件名里加空格或 echo $(cal) ?牛逼啊,还能SQL注入了!默认语意这么脑残
IFS=":" # read分隔符为冒号, 遍历可执行注册表
for dir in $PATH; do
echo "$dir"; done
export PATH #bash连字符串变量也不默认传给子进程
#有无屏幕, 其实 .bash_login 就是tty-only
(xdotool sleep .1 search --name tty windowsize 100% 100%)& alacritty
[ -z $DISPLAY ]&&startx /bin/sh atty.sh
read id; ${id:=Peter}
read id; ${id:?Oh no Peter}
#不建议用 declare -i c; c=1+2 或let=运算,可以
((a=1,b=2)); array=([2]=c [0]=a [1]=b) #读取 "${array[0或@]}"
— 权限
您的系统通过chown和setcap来管理特权,所有文件通过 umask: ugo(user grp other)三权分立,一般为 644, 755(=rwxrxrx 对于目录x允许进入)
6(rw-)即是位旗 0b100+0b10+0;
echo $[2#100+2#10]
,644以此类推特别地,wheel 用户组(类似win/droid的SYSTEM) 可使用/bin/sudo 来鉴权到sudo的所有者root。为了防止 LD_PRELOAD注入应使用 visudo 修改配置
find / -perm /4000列举所有自鉴权模块如su
sudo setcap cap_net_bind_service=+ep $(command -v python)#允许bind 80端口
# cat /etc/{,g}shadow /etc/{passwd,fstab,sudoers,ssh/sshd_config}
只有root能查看。权力越大责任越小,rm -rf /* 😱享受特权吧!— 古怪的语法
先前学过java的大佬,会觉得 if-fi case-esac for-done 比Lua和Matlab还啰嗦,这是因为bash采取了shlex 而且和TeX一样不懂变通
if [ ]; then, for in ; do
更像是2条命令(do eval字符串 done) 而不是“块”, forkBomb() { sleep; }
尾分号同理bash 区分命令和计算的$()也很含糊,但在pwsh上都是 ()
Telegram
duangsuse::Echo
#tool tty canvas #ai 编程失败
>用py实现 sudo hexdump /dev/input/mice -ve'3/1 "%d " "\n"'| for X,Y in lines: 叠加x=0,y=0 并移动终端光标
(很烂而且没有避print换行的坑)
gpmm() { #鼠标光标
stdbuf -o0 hexdump /dev/input/mice -e '3/1 "%d ""\n"'|awk -v kx=$((COLUMNS / LINES)) -e '!/*/{x+=$2/k*kx;…
>用py实现 sudo hexdump /dev/input/mice -ve'3/1 "%d " "\n"'| for X,Y in lines: 叠加x=0,y=0 并移动终端光标
(很烂而且没有避print换行的坑)
gpmm() { #鼠标光标
stdbuf -o0 hexdump /dev/input/mice -e '3/1 "%d ""\n"'|awk -v kx=$((COLUMNS / LINES)) -e '!/*/{x+=$2/k*kx;…