在 Linux 中,如何以 100%兼容 bash 命令和脚本的情况下,主用 powershell

2019-06-02 15:02:07 +08:00
 ps1aniuge
在 linux 中,如何以 100%兼容 bash 命令和脚本的情况下,主用 powershell

------ [概述] ------

问:如何看待 bash,及 linux shell 脚本将来的地位,命运?
问:powershell 在 linux 中的前景如何?
答:
就好像 [气泵射钉枪] 必将取代 [锤子] 一样,先进生产力必然代替落后的。
就好像面向对象的 powershell,必然取代面向字符的 bat 那样。
powershell 发展成熟后。以 bat,bash 为代表的,上一代面向字符串的脚本语言,面向字符串的命令,难免被边缘化。
过几年后,开机启动脚本,特简单的脚本中,或许还残留有 bat,bash,字符串命令的身影。



问:为什么要主用 powershell,边缘化 bash ?
答:
1 解决 bash 的癌症。
2 增加功能。 [强]
3 简化语法。 [简]
4 速度快。 [快]
新建万个空文本文件,linux 中的 ps,比 linux 中的 touch,快大约 10 倍
http://tieba.baidu.com/p/5895236874

搜并看:
百万简单循环耗时,powershell 为 bash 的 3.4%,或者反过来说 bash 耗时是 powershell 的 28 倍。





问:请举个例子?
答:
bash 有杀不死的 sleep。这本身是 bash 架构问题。
很多 bash 难解决的问题,只要把部分代码改成,调用 ps1 脚本返回结果,就根本不存在了。



问:在 linux 中主用 powershell 难么?
问:在 linux 中主用 powershell 改动大么?
答:
不难,改动小。
1 简单来讲,bash 中只有语法,没有命令和库。
2 bash 只有 1%的语法功能,powershell 实现不了。这很正常,世界上没有两片叶子是完全一样的。


问:世界上有 100%兼容 bash 的 shell 吗?
答:
世界上没有两片叶子是完全一样的。sh 和 bash 也不能 100%兼容。


问:在 linux 中主用 powershell。是否需要把默认 shell,bash 替换成 powershell ?
答:
不需要或不建议。




------ [原则和流程] ------
学用 pwoershell 语法,
学用 powershell 库,
在 bash 脚本中嵌入,powershell 命令或脚本。
在 ps1 脚本中嵌入,bash 命令或脚本。
并逐渐代用 /usr/bin/pwsh 代替 /usr/bin/bash。




------ [具体做法] ------

问:如何在.ps1 脚本中,嵌入 [ 100%兼容 bash 的] shell 命令?
答:
=====================
$bashcmd =
@'
echo '我是 bash 命令'
# linux-command |awk yyy |sed zzz
echo '命令中可以有单引号'
echo "命令中可以有双引号"
echo '如需解析变量,则用这种括号,注意头尾必须换行'
echo '@\"'
echo '$a'
echo '\"@'
'@
$powershell 变量 = /usr/bin/bash -c $bashcmd
#需要转义,有点不好
=====================

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


问:如何在.sh 中,嵌入 powershell 脚本?
答:
aaa=`/usr/bin/pwsh -f xxx.ps1 -参数 1 'aaa' -参数 2 777`



问:如何在.sh 中,嵌入 powershell 命令?
答:
aaa=`/usr/bin/pwsh -c "某 powershell 命令"`



问:如何在 ssh 远程连接中,使用 powershell 对象,而不是 bash 字符串?
问:如何让 powershell 成为默认的远程连接 shell ?
答:
在这个文件中 /etc/ssh/sshd_config
添加一行:
Subsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile

注意:这么做,不会对你经 ssh,远程使用 bash 命令,产生任何影响!
不影响!没影响!

你不用手动添加,下面安装命令已经给你做好了。






------ [安装 linux 版 powershell ] ------

centos7 及以上,安装 powershell:
curl -o /etc/yum.repos.d/microsoft.repo https://packages.microsoft.com/config/rhel/7/prod.repo
sudo yum remove -y powershell #删除旧版
sudo yum install -y powershell
pwsh -c 'mkdir -p "$env:HOME/.config/powershell" '
pwsh -c 'Add-Content -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile '
pwsh -c 'Add-Content -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config '



ubuntu1604:
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
sudo curl -o /etc/apt/sources.list.d/microsoft.list https://packages.microsoft.com/config/ubuntu/16.04/prod.list
sudo apt-get update
sudo apt-get remove -y powershell #删除旧版
sudo apt-get install -y powershell
pwsh -c 'mkdir -p "$env:HOME/.config/powershell" '
pwsh -c 'Add-Content -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile '
pwsh -c 'Add-Content -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config '


ubuntu1804:
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
sudo curl -o /etc/apt/sources.list.d/microsoft.list https://packages.microsoft.com/config/ubuntu/18.04/prod.list
sudo apt-get update
sudo apt-get remove -y powershell #删除旧版
sudo apt-get install -y powershell
pwsh -c 'mkdir -p "$env:HOME/.config/powershell" '
pwsh -c 'Add-Content -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile '
pwsh -c 'Add-Content -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config '



debian9:
sudo apt-get update
sudo apt-get install curl gnupg apt-transport-https
curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-debian-stretch-prod stretch main" > /etc/apt/sources.list.d/microsoft.list'
sudo apt-get update
sudo apt-get remove -y powershell #删除旧版
sudo apt-get install -y powershell
pwsh -c 'mkdir -p "$env:HOME/.config/powershell" '
pwsh -c 'Add-Content -Value "Set-PSReadlineOption -EditMode Windows" -LiteralPath $profile '
pwsh -c 'Add-Content -Value "`nSubsystem powershell /usr/bin/pwsh -sshs -NoLogo -NoProfile" -LiteralPath /etc/ssh/sshd_config '


安装方法:
https://docs.microsoft.com/zh-cn/powershell/scripting/setup/installing-powershell-core-on-linux?view=powershell-6


------ [终章] ------
你是一个医院院长,来了病号,你让病号去找 [白大夫 bash ] 治病。
但你发现 [白大夫] 治的疗效不好,这时候就应该让病号去找 [潘大夫 powershell ] 。

怎么才能让这两个大夫 100%兼容呢?答案是嵌入。把 [白大夫] 嵌入 [潘大夫] ,或反之。

医院里病号太多,而 [白大夫] 只会治疗 [字符串病] ,连 [布尔] 这种简单的 0,1 病都治不了。
[潘大夫] 就不同了,不但会 [字符串] [布尔] [日期] [哈希表] 等,还会多线程。
这时候院长你就应该让 [白大夫] 下岗,主用 [潘大夫] 为你院 996 服务~~~
6559 次点击
所在节点    Linux
43 条回复
uyhyygyug1234
2019-06-02 15:20:35 +08:00
这感觉是癌症西医不行了,中医死马当活马医啊。。。
qinghon
2019-06-02 15:58:14 +08:00
那么怎么解决在一个刚装什么都没有的系统里不装其他依赖的情况下运行 ps1 脚本?
再附一个问题,对有的脚本自动不能识别需要自己手动修改脚本内容的地方如何解决?
goreliu
2019-06-02 16:03:57 +08:00
在 Linux 下,powershell 取代 bash 基本是不可能的了,这不是时间长短的问题。不过自己感兴趣的话用用倒也可以。
yuuko
2019-06-02 16:09:05 +08:00
linux 默认支持 powershell 么?不支持的话我为什么要用,还不如装个 nodejs
tinytangent
2019-06-02 16:40:11 +08:00
个人我觉得 PowerShell 连 cmd 都没完全取代,还取代 bash ……这东西不是说设计理念先进就解决一切问题的。bash 已经是事实标准一样的存在了,就算它再丑也得接着用。

要真说取代 bash,还不如指望 Python 之类的脚本语言呢。搬出 PowerShell 未免……
qinghon
2019-06-02 16:58:50 +08:00
@qinghon 对了,安装 powershell 好麻烦呀,有没有一键脚本?[滑稽]
secondwtq
2019-06-02 17:03:01 +08:00
十分建议感兴趣的同学通读楼主发言记录,充分学习楼主的 Linux 新时期 PowerShell 中心思想
ysc3839
2019-06-02 17:08:19 +08:00
@tinytangent PowerShell 在 Windows 上无法取代 cmd 的一个可能原因是不能直接执行脚本,好像需要改什么设置才能执行。
skinny
2019-06-02 17:51:38 +08:00
PowerShell 说真的并没有那么好用,就我在 Windows 上的体验来说是这样:
1. 部署新版本非常麻烦,而旧版本又有各种问题
2. 有的 Cmdlet 有 Bug (比如 Remove-Item 递归删除特定通配符名字时有问题,好像是所有版本都有这个问题,虽然可以通过组合 Get-ChildItem 解决)。
3. 不同版本的一些行为有很大差异,但是如果你试图在高版本下用-Version 参数来测试脚本在特定版本下的运行结果,是没办法发现问题的。比如一个参数有多个 ParameterSetName 时,且有复杂的组合时,在真的 PowerShell 2.0 下不能运行,但是高版本下使用-Version 参数运行又完全正常。

不过在 Windows 平台的一些特定场合,如果下面几点同时满足,我会选择 PowerShell:
1. 在 Windows 7 及以上系统运行
2. 不能或不方便下载安装额外的软件包、工具
3. 需要一点简单的 GUI ( PowerShell 加 WPF,写简单的 Windows GUI 好用)

至于在 Linux 下……拜托,我还不如用系统预装好的 Python ……有那功夫安装 PowerShell,还不如把时间用在安装几个 Python 包。
skinny
2019-06-02 17:54:22 +08:00
@ysc3839 需要设置运行策略,实际上感觉有点鸡肋……
wwqgtxx
2019-06-02 18:05:05 +08:00
在 linux 上用 ps,那干嘛不用 Python 写,功能强大得多,大部分系统还预装
Dk2014
2019-06-02 18:11:46 +08:00
看了下楼主回帖记录,民科程序员?
Foxkeh
2019-06-02 18:14:44 +08:00
python+1 代码容易维护
SuperMild
2019-06-02 18:17:43 +08:00
既生瑜何生亮,可惜这家医院已经有一个 派大夫。
Jirajine
2019-06-02 18:30:58 +08:00
楼主你是 PowerShell 开发组的吗?这传销般的推广力度。。
love
2019-06-02 18:47:11 +08:00
竟然还有人粉 ps 的, 估计是 windows 爱好者爱屋及乌了
hanxiV2EX
2019-06-02 19:18:04 +08:00
这...Windows 程序员也没几个会写 bat 吧...
labnotok
2019-06-02 19:20:55 +08:00
先了解 bash/zsh/fish 的人,会有心情去用 PS ?
diggerdu
2019-06-02 20:05:33 +08:00
为啥不用 python 呢
swsh007
2019-06-02 20:28:12 +08:00
还得 bash 好了
ms 这个半吊子的东西还不如 cygwin

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

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

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

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

© 2021 V2EX