用 vscode+powershell,帮 shell 脚本实现单步,断点的例子 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
ps1aniuge
V2EX    Linux

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

  •  
  •   ps1aniuge 2019 年 6 月 20 日 3959 次点击
    这是一个创建于 2429 天前的主题,其中的信息可能已经有所发展或是发生改变。
    《单步、断点、图形界面调试,鼠标选中 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 [email protected] '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 机子。
    1 条回复    2019-06-20 15:14:26 +08:00
    ps1aniuge
        1
    ps1aniuge  
    OP
       2019 年 6 月 20 日
    结论:
    remote-ssh 扩展,给 powershell 带来了,远程打开文件。
    remote-ssh-explorer 扩展,给 powershell 带来了,远程浏览目录,文件。
    powershell-preview 扩展,帮 powershell 带来了,远程调试。
    远程调试,是最主要的功能。你还可以在 linux 机子上,安装 c#扩展,py 扩展,java 扩展等。调试工具。
    关于     帮助文档 nbsp;   自助推广系统     博客     API     FAQ     Solana     969 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 23:14 PVG 07:14 LAX 15:14 JFK 18:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86