V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
ps1aniuge
V2EX  ›  Linux

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

  •  
  •   ps1aniuge · 2019-06-20 15:04:58 +08:00 · 3561 次点击
    这是一个创建于 1772 天前的主题,其中的信息可能已经有所发展或是发生改变。
    《单步、断点、图形界面调试,鼠标选中 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-06-20 15:14:26 +08:00
    结论:
    remote-ssh 扩展,给 powershell 带来了,远程打开文件。
    remote-ssh-explorer 扩展,给 powershell 带来了,远程浏览目录,文件。
    powershell-preview 扩展,帮 powershell 带来了,远程调试。
    远程调试,是最主要的功能。你还可以在 linux 机子上,安装 c#扩展,py 扩展,java 扩展等。调试工具。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2975 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:13 · PVG 21:13 · LAX 06:13 · JFK 09:13
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.