用 vscode+powershell,帮 shell 脚本实现单步,断点的例子

2019-06-20 15:04:58 +08:00
 ps1aniuge
《单步、断点、图形界面调试,鼠标选中 n 行右键执行,powershell 极大提升了 linux 脚本生产力》

---linux 中调试 ps 脚本的注意事项



--------- [第一章 在 linux 中用 shell 脚本,有啥坏处?] ---------
shell 脚本单步,断点难。尤其有些是 awk 子语句,sed 子语句,甚至还有 python。
这根本就是相当于进入了另一种计算机语言。
甚至调试 1 个 shell 脚本耗费的时间精力,顶调试 20 个 ps 脚本。

shell 的 if,awk 的 if,sed 的 if,python 的 if,4 种 if。
这就好像你脚上套了 4 层鞋一样,很酸爽。请看:


=========== [ shell 脚本单步,断点难的例子] ===========
sed -e 'p;s,.V,,;n;h_' \
-e s|.»|.|* \
-e .*/,f ; s/$(EXEEXT)$$//;$(transform); s/$$/$(EXEEXT)/* | \
sed 'N;N;N ; sf\n, ,g' | \
$(AWK) 'BEGIN { files[".M] = dirs[".M] = 1 } \
{ d=$$3 ; if (dirstd] != 1) { print "d", d ; dirs[d] = 1 } \
if ($$2 == $$4) filestd] = files[d] M H $$1 ; \
else { print "fM, $$3 V" $$4, $$1; } } \
END { for (d in files) print "f", df filestd] }'
=========== [ shell 脚本单步,断点难的例子] ===========

这也是为啥要用 linux 版 powershell 的原因。




--------- [第二章 在 linux 中用 powershell 脚本,有啥好处?] ---------
好处之一是可以用 vscode 调试。
这样就有了和 win 同等的待遇:
1 在 vscode 图形界面查看变量名,变量值。
2 单步。
3 断点。
4 在 vscode 图形界面中,鼠标选中 n 行脚本,右键,执行。
5 完全支持中文脚本名、参数名、变量名、函数名、的运行和调试。

请看图:


--------- [为啥要在 linux 上调试 ps 脚本] ---------
问:啥时候用 linux 版 vscode,单步、断点调试 linux 版 ps 脚本?
答:
当 ps1 脚本中,含有 linux 命令的时候。
当 win 中无法 100%重现,linux 环境,linux 命令时,那么你就需要在 linux 中调试。


--------- [第三章 linux 中调试 ps 脚本的注意事项] ---------
应该尽量少用 linux 外部命令。
或者把 linux 外部命令,用 bash 包裹起来,存放入 ps 变量值。

=====================
$bashcmd =
@'
echo '我是 bash 命令'
echo '命令中可以有单引号'
echo "命令中可以有双引号"
echo '如需解析变量,则用这种括号,注意头尾必须换行'
echo '@\"'
echo '$a'
echo '\"@'
'@
$powershell 变量 = /usr/bin/bash -c $bashcmd
#需要转义,有点不好
=====================

$powershell 变量 =
@'
echo '我是 bash 命令'
echo '命令中可以有单引号'
echo "命令中可以有双引号"
echo '如需解析变量,则用这种括号,注意头尾必须换行'
echo '@"'
echo '$a'
echo '"@'
'@ | /usr/bin/bash
#不需要转义,推荐
=====================


问:为啥用 bash 把命令包裹起来?
答:
世界上没有片 100%相同的叶子,也没有 100%相同的脚本解释器。sh 和 bash 甚至解释都不同。
ps 解释 linux 外部命令,和 bash 主要在 [转义] ,有细小差别。
为了 100%兼容 bash 旧命令和返回的结果,就要用 bash 包裹。


从 win 到 linux 远程,用 vscode+powershell,帮 shell 脚本实现单步,断点的例子。
=====================
#第一行代码。
#在下面这行代码上,下断点。
$powershell 变量 =
@'
ls -l /tmp |awk '{print $9}'
'@ | /usr/bin/bash
#第 n 行代码。

=====================

--------- [第四章 在 win 中用 vscode,远程调试 linux 中的 ps1,的步骤] ---------

1 在 win 上安装最新版 vscode,最低为 1.35.1。


2 安装 vscode 插件:remote-ssh,remote-ssh-explorer


3 定义 ssh 配置文件路径:
编辑 c:\Users\你的用户名\AppData\Roaming\Code\User\settings.json
加上一行:
"remote.SSH.configFile": "d:\\vscode\\remote.txt"


4 编写 ssh 配置文件内容:
d:\vscode\remote.txt ,bom 头+utf8 格式。支持多个服务器,支持中文。

Host 吃鸡 ps62
User root
HostName 192.168.111.62
IdentityFile ~/.ssh/id_rsa


5 下载 ssh:
https://github.com/PowerShell/Win32-OpenSSH/releases
用 ssh7-key7gen.exe ,生 7 成 7 秘 7 钥 7 对。


6 使用我编写的 ssh-copy-id6.ps1 即可部署本机公 7 钥,到各个 linux 服务器。
脚本最新版下载地址:
https://pan.baidu.com/s/1n3ahVhYTyrGIm9n4N1SPRw
提取码:i55m


7 测试:
ssh.exe root@192.168.111.62 'date'


8 点击左下角,点 [吃鸡 ps62 ] 。发现打开了一个 [新 ssh 的子 vscode 窗口] 。
这个窗口其实就是 linux 中安装的,linux 版 vscode。
本地 vscode,把远程 vscode,偷偷安装在了 ~/.vscode-server
可以在这个 [新 ssh 的子 vscode 窗口] ——》 插件里面,安装中文插件。
可以在这个 [新 ssh 的子 vscode 窗口] ——》 插件里面,安装 xxx 语言插件。
有了这个插件,即可代码高亮补全和调试,跟本地 vscode 一样。
若跟本地 vscode 不一样,或者调试不灵,那么就是测试版的 bug。


9 在这个 [新 ssh 的子 vscode 窗口] 中,安装 [ powershell-preview ] 扩展。
注意:
[ powershell ] 扩展,目前还不支持远程调试。
你需要安装 [ powershell-preview ] 扩展。
remote-ssh 这是一个新功能,需要下一个稳定版本的 powershell 扩展才支持。


10 打开 a.ps1 ,在某一行下断点,然后按 f5。


11 点菜单---》终端---》新建终端。
即可打开 [那台 linux ] 的命令行,即 bash。


12 看看左下角,就知道你连接到了哪台 linux 机子。
3565 次点击
所在节点    Linux
1 条回复
ps1aniuge
2019-06-20 15:14:26 +08:00
结论:
remote-ssh 扩展,给 powershell 带来了,远程打开文件。
remote-ssh-explorer 扩展,给 powershell 带来了,远程浏览目录,文件。
powershell-preview 扩展,帮 powershell 带来了,远程调试。
远程调试,是最主要的功能。你还可以在 linux 机子上,安装 c#扩展,py 扩展,java 扩展等。调试工具。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/575848

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX