bash_八数码问题 - CSDN
bash 订阅
Bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell。Bash是Bourne shell的后继兼容版本与开放源代码版本,它的名称来自Bourne shell(sh)的一个双关语(Bourne again / born again):Bourne-Again SHell。Bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。Bash还能从文件中读取命令,这样的文件称为脚本。和其他Unix shell 一样,它支持文件名替换(通配符匹配)、管道、here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。包括关键字、语法在内的基本特性全部是从sh借鉴过来的。其他特性,例如历史命令,是从csh和ksh借鉴而来。总的来说,Bash虽然是一个满足POSIX规范的shell,但有很多扩展。一个名为Shellshock的安全漏洞在2014年9月初被发现,并迅速导致互联网上的一系列攻击。这个漏洞可追溯到1989年发布的1.03版本。 展开全文
Bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell。Bash是Bourne shell的后继兼容版本与开放源代码版本,它的名称来自Bourne shell(sh)的一个双关语(Bourne again / born again):Bourne-Again SHell。Bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。Bash还能从文件中读取命令,这样的文件称为脚本。和其他Unix shell 一样,它支持文件名替换(通配符匹配)、管道、here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。包括关键字、语法在内的基本特性全部是从sh借鉴过来的。其他特性,例如历史命令,是从csh和ksh借鉴而来。总的来说,Bash虽然是一个满足POSIX规范的shell,但有很多扩展。一个名为Shellshock的安全漏洞在2014年9月初被发现,并迅速导致互联网上的一系列攻击。这个漏洞可追溯到1989年发布的1.03版本。
信息
中文名
重击
全    称
Bourne-Again Shell
外文名
bash
类    别
计算机程序
命令语法
Bourne shell命令语法的超集
bash概念
Bash (GNU Bourne-Again Shell) 是许多Linux发行版的默认Shell [1]  。事实上,还有许多传统UNIX上用的Shell,例如tcsh、csh、ash、bsh、ksh等等,Shell Script大致都类同,当您学会一种Shell以后,其它的Shell会很快就上手,大多数的时候,一个Shell Script通常可以在很多种Shell上使用。bash是大多数Linux系统以及Mac OS X默认的shell,它能运行于大多数类Unix风格的操作系统之上,甚至被移植到了Microsoft Windows上的Cygwin系统中,以实现Windows的POSIX虚拟接口。此外,它也被DJGPP项目移植到了MS-DOS上。bash的命令语法是Bourne shell命令语法的超集。数量庞大的Bourne shell脚本大多不经修改即可以在bash中执行,只有使用了Bourne的特殊变量或内置命令的脚本才需要修改。 bash的命令语法很多来自Korn shell (ksh) 和 C shell (csh), 例如命令行编辑,命令历史,目录栈,$RANDOM 和 $PPID 变量,以及POSIX的命令置换语法: $(...)。作为一个交互式的shell,按下TAB键即可自动补全已部分输入的程序名、文件名、变量名等等。 [2] 
收起全文
  • 作为一个萌新,我翻遍了网上的Git Bash教程,可能因为我理解力比较差,经常看不懂教程上在说什么。 (。-`ω´-)所以我决定自己一边摸索一边记录,写教程造福那些理解力跟我一样差的人…… 第一篇教程会涉及...

    作为一个萌新,我翻遍了网上的Git Bash教程,可能因为我理解力比较差,经常看不懂教程上在说什么。 (。-`ω´-)所以我决定自己一边摸索一边记录,写教程造福那些理解力跟我一样差的人……



    这个主要介绍Git Bash的使用教程。

    1 下载安装

    首先抛一个Windows用户的下载链接:Git for windows
    下载下来之后直接安装,除了下图选第一个,其他的不用改,直接next就行。
    下图这个是决定是否把git命令放到path中,你不用理解path是什么,反正你如果你加入到path之后,gitbash可能会变得反应特别慢。
    选这个use git from git bash only就是告诉他不要给我加到path中
    在这里插入图片描述
    安装完成后我的电脑上是显示了这么三个东西的。
    这里写图片描述

    • Git CMD:
        Git CMD我并没用过,但是我查了一下它是什么。据别人说,Git中的Bash是基于CMD的,在CMD的基础上增添一些新的命令与功能。所以建议在使用的时候,用Bash更加方便(原网址)。
    • Git GUI:
        其次就是Git GUI,Git GUI是Git Bash的替代品,他为Windows用户提供了更简便易懂的图形界面。(但是相比GitHub Desktop这个桌面版客户端,_(:3 」∠)我觉得Git GUI也没什么用。)
    • Git Bash:
        最后是Git Bash,Git Bash是命令行操作,官方介绍有一句就是“让*nix用户感到宾至如归。”((;´༎ຶД༎ຶ`) 当然了,萌新用户使用了就肥肠憋屈。)

    2 设置用户

    下载之后打开是这个样子的,第一件事设置用户。注意这个不是登录哦,是给你的电脑设置一个用户,等你上传的时候,告诉远程仓库是谁上传的而已。

    git config --global user.name "Your Name"注意前边是“- -global”,有两个横线
    git config --global user.email "email@example.com"
    在这里插入图片描述


    3 本地文件夹的操作

    3.1 进入文件夹

    首先你可以试着打开你本地仓库的文件夹。
    比如我要打开E:\code有两种方法

    1. 直接在电脑上打开那个文件夹,然后在文件夹空白处右键选择Git Bash here
      在这里插入图片描述

    2. 在Git Bash中输入路径
      注意! 使用cd命令进入到目录中时,在Git-Bash中应该使用斜线”/”, 而不是反斜线”\”
      ①可以逐个输入文件夹名(在文件夹名称前要加cd )
      在这里插入图片描述
      ②也可以直接输入一个完整的文件夹路径
      在这里插入图片描述

    3.2 查看

    • 当前目录
      你输入命令之前上边有一行字,后边那段黄色的就是你所在的文件夹位置。你也可以输入$ pwd,回车之后进行查看。在这里插入图片描述
    • 查看当前文件夹都有什么文件$ ls
      在这里插入图片描述

    3.3 退出文件夹

    当然你也可能进错文件夹,要学会回退。
    $ cd .. 点和cd之间有空格

    就可以回退到上一个文件夹。
    在这里插入图片描述

    3.4 新建、删除

    $ mkdir +文件夹名字 只能新建文件夹
    我在E盘的code文件夹下新建一个front-end文件夹。建完之后打开文件夹看看创建成功了嗷。
    在这里插入图片描述
    touch +文件名 只能新建文件
    在这里插入图片描述

    $ rm 文件名.文件类型 删除文件
    在这里插入图片描述
    $ rm -r 文件夹删除文件夹 ,注意这个要回到上一级文件夹才可以删。比如我要删除front-end文件夹,front-end在code里边,我就要在code目录下删除。
    在这里插入图片描述


    4 仓库设置

    你既然学git,那就是想要把本地的代码放到远程仓库托管。
    托管就是,代码是小朋友,你就是他父母,你把它丢到托儿所,让托儿所帮你管。怎么去托儿所,总不能一生下来就在托儿所。你得把孩子从家里送过去吧。放学了你得把孩子接回来吧。(当然这个例子不太恰当。)
    那你需要一个本地存储代码的地方(家里),你还需要一个远程仓库(托儿所)

    4.1 初始化本地仓库

    进入到你想建立本地仓库的文件夹,它可以是空的,你建好了之后再写代码。里边也可以有东西,直接建就好。
    $ git init
    我用个空文件夹做示范:E:\code\front-end
    在这里插入图片描述
    初始化成功之后,你的文件夹里就会多出.git的隐藏文件。 (●′ω`●)千万不要乱删,你如果看他烦你就设置一下不显示隐藏文件。

    4.2 新建远程仓库

    打开github右上角,点击new repository
    在这里插入图片描述
    在这里插入图片描述

    • 说一下仓库的私有和公有
      本来也是个开源社区,很多大佬们都把自己的东西开源了,也就是放在共有仓库里,可以让人查阅。也鼓励大家使用共有仓库 (๑•́ ₃•̀๑)。
      以前使用私有仓库是付费, 或者你可以申请学生认证获得私有仓库的使用权。但是现在2020年3月份的时候我收到github的邮件,邮件里边说现在已经开放私有仓库的使用了。
    • 说一下学生认证
      以前github的教育认证可以让学生和教育者免费使用私有仓库,并且还有许多其他的优惠政策。比如github的一些付费功能,教育认证之后会有巨大的折扣。戳我查看如何进行学生认证╰(●’◡’●)╮

    4.3 建立连接

    孩子在家里,你能用意念让他直接飞到托儿所吗,显然不可能,那你总得把他送过去,或者用校车之类的吧。
    那现在就得想办法建立远程仓库和本地仓库的连接。
    4.3.1 配置SSH,给孩子联系好校车。
    ヽ(・ω・。)ノ点击进入《SSH Key配置教程》
    4.3.2 配置完SSH,你就可以使用SSH连接了。
    注意,你是仓库的主人你才能使用SSH连接,如果你不是仓库主人,只是某个项目的成员,那你只能使用HTTPS连接。
    不管使用哪一种连接方式,都是一样操作,现在我就用SSH链接了。复制红框框里的代码。
    在这里插入图片描述
    4.3.3 在你的本地仓库打开gitbash。
    $ git remote add + 名字 + 连接地址
    连接地址就是你刚才复制的那块。
    我下边写的就是添加一个叫origin的远程仓库。
    在这里插入图片描述

    • 名字origin:你在往远程仓库推送的时候,你会说我要推给谁,总得给它起个名字。(你把孩子送去托儿所,你总得告诉司机是哪个托儿所吧)并且你以后可能会一个本地仓库连接多个远程仓库(这是后话),所以必须起名字加以区分。
    • 补充一下:你的本地仓库可以链接多个原厂仓库,github毕竟是国外的,有时候访问起来会很慢,因此你可以连接到国内的仓库上,比如gitee之类的。详细可以等你学会了这个文章之后,戳一下看这一篇→git bash 连接多个远程仓库

    4.3.4 添加之后没有任何提示,如果你想确定是否成功了,你可以再输一遍,这时候他会提示你刚才已经设置过了。
    在这里插入图片描述
    上边的方法能用但是比较笨(…•˘_˘•…),所以你得学个高端一点的。
    $ git remote -v
    测试一下,看到没。显示我已经添加了叫origin的仓库。一个push一个fetch,就是一个把代码推到远程仓库,一个把代码从远程仓库取回来。这两个一定是成对存在的。
    在这里插入图片描述
    补充一点:如果你以后不想连接这个远程仓库了,只需要输入git remote remove + 名字即可。比如我刚才添加的远程仓库代称是origin,那我就要写:git remote remove origin

    4.4 文件上传

    4.4.1 git add修改的文件添加暂存区,也就是将要提交的文件的信息添加到索引库中。(看不懂没关系,现在来说这个不重要)。
    什么是修改的文件,你新建、更改、删除文件都是修改。
    git add有好多种。下边我介绍一下,看看就行,对现在来说记住最后一条就可以了

    • $ git add +文件名.文件类型 ,将某个文件加到缓存区
    • $ git add +文件名.文件类型 ... 文件名.文件类型 ,将n个文件添加到缓存区
    • $ git add xx文件夹/*.html,将xx文件夹下的所有的html文件添加到缓存区。
    • $ git add *hhh ,将以hhh结尾的文件的所有修改添加到暂存区
    • $ git add Hello* ,将所有以Hello开头的文件的修改添加到暂存区
    • git add -u ,提交被修改(modified)和被删除(deleted)文件,不包括新文件(new)
    • git add .,提交新文件(new)和被修改(modified)文件,不包括被删除(deleted)文件
    • git add -A,提交所有变化git add前几条都可以记不住,这个必须记住!!!

    在这里插入图片描述
    我现在在本地仓库新建一个文件叫readme.md,现在我将它添加到缓存区。(没错虽然图里是read,但是我就是要创建叫readme的文件,往后看就明白了)
    在这里插入图片描述

    4.4.2 git commit命令将索引的当前内容与描述更改的用户和日志消息一起存储在新的提交中。(看不懂没关系,现在来说这个不重要)。你现在可以简单的理解为给你刚才add的东西加一个备注,你上传到远程仓库之后,修改的文件后边会显示这个备注
    $ git commit -m "修改注释"
    在这里插入图片描述
    一定要加-m,否则会进入vim编辑器。对于不熟悉的人来说会很麻烦。所以还是加上-m
    4.4.3 git push激动的搓搓小手,终于要把文件推到远程仓库了。
    向一个空的新仓库中推文件:$ git push -u 仓库名称 分支

    • 仓库名称:刚才我添加连接的时候,给仓库起名叫origin
    • 分支:你现在只有主分支,所以分支直接写master。以后合作项目的时候,成员之间建了不同的分支,你就可以往你自己的分支上推。

    在这里插入图片描述
    我们第一次推送master分支时,加上 –u参数才会把本地的master分支和远程的master分支关联起来,就是告诉远程仓库的master分支,我的本地仓库和是对着你的哦,不是对着别的分支的哦。
    只有第一次推的时候需要加上-u,以后的推送只输入:
    $ git push 名称 分支
    还有一个$ git push origin master -f 强制推送,如果你某次推送失败,git bash报错,你懒得处理错误,你就可以用这个。但是有风险,因为报错90%是因为你本地仓库和远程仓库数据发生冲突,使用这个会直接用本地数据覆盖掉远程数据,可能损失数据哦。

    现在你去网页版刷新一下,就可以看到你本地仓库的东西都在那里了。并且文件后边写着你在commit步骤中添加的注释。
    在这里插入图片描述
    4.4.4 其他
    (눈_눈)我缓缓打出一个问号,我的commit怎么多写了一个e?我文件名字叫readme我怎么就写了read
    先来看看怎么查看自己的提交记录?虽然写错了查看提交记录也没用。我就是单纯想让你们多学一条命令:
    $ git log
    在这里插入图片描述
    提交记录里也显示我就是多写了一个e。

    • 怎么抢救一下commit的注释?
      $ git commit --amend -m "修改的内容"
    • 那怎么抢救一下文件名?
      直接修改文件名重新提交就可以啦。
      git add -A —> git commit -m “修改文件名” —> git push origin master
      在这里插入图片描述
      ?push时候报错?
      这是因为github觉得我的本地仓库和远程仓库冲突了:
      因为我刚才在本地修改了上一次的commit信息。(后边详细解释
      $ git push origin master -f 这个-f就是force,强制推送。

    推完之后看看你的远程仓库,文件名改了,文件名后边的注释也是我第二次commit的注释。上边有个commit选项,
    在这里插入图片描述
    在这里插入图片描述

    • 补充解释
      • $ git commit --amend的作用:
        github不管你做错了啥,他都会给你保存的,就是即使你改了,你的错误记录永远存在!但是使用git commit --amend,你可以神不知鬼不觉悄咪咪修改你的错误commit注释,╭(●`∀´●)╯只有天知地知你知。

      • push时候报错:
        github你可以理解为差额备份,就是你本地提交上去之后,它备份起来。你本地修改了,它会对你修改的部分继续备份。也就是说在你这次修改之前,本地仓库应该和远程仓库一模一样。
        但是我刚才强行修改了上次的commit注释信息。现在本地仓库里;

        • 上次的commit是“新建了readme”,
          使用git log看一下,本地仓库上次的提交注释确实是改变了。在这里插入图片描述
        • 但是远程仓库上次的commit是“readmee”。

        我修改的是上次的commit,所以我这次推的时候github就认为这次修改之前的本地仓库和远程仓库不一样,因此就会报错说我数据冲突。

    4.5 文件下拉

    上边push报错,我自己知道数据差在哪里,所以使用了强制推送。但是在团队合作中,push报错,那铁定是你队友修改了远程仓库,如果你再强制上传,那你就是毁了你队友的代码。所以如何保证在你修改之前,自己的文件跟远程仓库一致呢。
    方法1: $ git pull 仓库名称

    尝试一下
    比如我现在跑到我的远程仓库修改了readme:

    • 点要修改的文件,进去之后点击编辑。
      在这里插入图片描述
    • 写内容
      在这里插入图片描述
    • 写完内容提交
      在这里插入图片描述
    • 这时候我已经修改成功了
      在这里插入图片描述
    • git pull完成之后打开本地的readme,发现hello world已经进来了嗷。
      在这里插入图片描述
    • git log看一下,commit的记录也显示了。
      在这里插入图片描述

    方法2:
    $ git fetch + $ git merge

    尝试一下,

    • 这次我又在远程仓库加一行字
      在这里插入图片描述
    • git fetch,看起来数据也是拉下来了,要 git merge干嘛。然鹅! 事情是这样的,git fetch之后,我打开本地文件,发现内容没变
      在这里插入图片描述
    • 那继续git merge,这之后本地文件内容才改变!
      在这里插入图片描述

    我在提示一下,我在fetch之后,不止没有修改本地文件,就连git log也没显示我下拉文件了,但是merge之后就都显示了。我们可以认为 pull = fetch+merge。git fetch 并没更改本地仓库的代码,只是拉取了远程数据,git merge才执行合并数据。

    回想一下你刚才是怎么push到远程的

    • git add添加到上传缓存区
    • git commit给缓存区的内容添加备注,此时本地的commit修改啦,但是远程的commit和文件都没修改。
    • git push 修改远程文件和commit信息

    而你下拉文件过程

    • git fetch 将数据拉下来,但是没修改本地的commit和文件
    • git merge 改变本地数据

    4.5 文件克隆

    下拉仓库学会了,那克隆呢?
    克隆就是你本地上没有,你直接把远程仓库的东西搞下来。
    我现在有一个完整仓库,点击右边的绿色按钮。
    在这里插入图片描述
    在这里插入图片描述

    • 如果你只想看看源码,那你可以直接选download zip,下载源码压缩包。
    • 如果你使用的是git desktop,那你就选open in desktop
    • 如果你想学克隆你就继续看,很简单的就一句。

    仓库是你自己的,你就使用SSH连接,不是你自己的,你没权限你就切换到HTTPS,再复制地址。
    它克隆下来是一个文件夹,你想把文件夹放哪里就在哪打开gitbash
    $ git clone 加上你刚才的地址
    在这里插入图片描述
    我在E:\code\vue里执行了克隆。
    (。◕ˇ∀ˇ◕)。下载完成后,打开这个文件夹,就发现里边有个文件夹了。文件夹名字就是远程仓库的名字。
    在这里插入图片描述
    还记得git remote -v吗?用它看一下你下下来的本地仓库连接上那个远程仓库没。
    在这里插入图片描述
    已经连接了嗷。放心使用吧。


    我是萝莉Ann, 梦想是当个程序媛。(●´∀`)♪永不服输!

    展开全文
  • 一般在Mac上配置环境变量时经常要创建、编辑 .bash_profile文件。 创建该文件时一般都会选择在当前用户目录下,即Mac下的.bash_profile 文件的路径是 /Users/YourMacUserName/.bash_profile (如果该文件已经创建过...

    一般在Mac上配置环境变量时经常要创建、编辑 .bash_profile文件。
    创建该文件时一般都会选择在当前用户目录下,即Mac下的.bash_profile 文件的路径是 /Users/YourMacUserName/.bash_profile (如果该文件已经创建过的话)

    这里写图片描述

    1、创建 .bash_profile

     (1) 启动终端
    
     (2) 进入当前用户的home目录(默认就是): 
            cd ~   或 cd /Users/YourMacUserName  
    
     (3)输入touch .bash_profile
    

    2、查看 、编辑 .bash_profile 文件

     (1)终端输入 open -e .bash_profile 
       (如果只是查看,直接使用open .bash_profile)
    
     (2)编辑
    
     (3)关闭即可保存修改
    

    3、更新刚配置的环境变量

      输入source .bash_profile
    
    展开全文
  • 和其他语言一样Bash的循环结构中也有while语句。它的基本结构为 while 条件;do 循环体;done 和其他语言不同的是,bash脚本中的while条件很丰富,可以是方括号[]就像if那样的条件,也可以是终端的命令作为条件。bash...
    总第8篇
    本系列(玩转Bash脚本)更多文章,请访问:http://blog.csdn.net/column/details/wanbash.html


    和其他语言一样Bash的循环结构中也有while语句。

    基本结构

    while 条件
    do
        循环体
    done

    和for语句一样,它的循环体同样是do…done结构。我们可以把while语句再折叠一下

    while 条件;do
        循环体
    done

    还能进一步折叠成一行体

    while 条件;do 循环体;done

    Bash语句大都可以写作一行,只不过可读性差

    和其他编程语言不同的是,Bash中的while语句用法是比较多样的。可以根据while条件的不同,将while语句分为几类。

    while条件

    方括号[ ]

    和if语句的条件相同。即操作符[ ]。关于[ ]的用法请参考之前的文章。

    #!/bin/bash
    n=1
    while [ $n -le 10 ]
    do
        echo $n
        let n++    #或者写作n=$(( $n + 1 ))
    done

    在前面的文章中,已经讲过了操作符[ ]test语句是等价的,所以这里也可以用test语句来作条件。

    终端命令

    while的条件可以是各种终端的命令。包括外部命令或bash内建(built-in)命令都可以。因为命令都是有返回值的(可以用echo $?查看),命令执行的成功与否就是while条件的真或假。

    以read命令来举个例子

    #!/bin/bash
    while read var;do
        echo "您输入的是$var"
    done

    这个程序是个死循环,将不停地等待您的输入,并回显出来。

    这里的命令可以是单个命令也可以是组合命令,比如用逻辑连接符连接的命令,或者管道、重定向组成的长命令

    死循环

    除了让while条件恒成立外,编程语言都有一种简洁的死循环写法。比如C语言中典型的死循环条件是while(1),而java中的写法是while(true)。 
    而Bash中的写法则简单的多,只需要一个冒号。

    #!/bin/bash
    while :
    do
        echo I love you forever
    done

    这是一个死循环,执行之后请用按组合键Ctrl+C来终止它。 
    此外,还有一种死循环写法就是利用系统自带的true命令(/bin/true

    #!/bin/bash
    while /bin/true
    do
        echo I love you forever
    done

    由于我们的系统环境变量(PATH)中一般都包含了路径/bin,所有我们也可以简写成while true

    while实现菜单demo

    我们或许曾经用C/C++在控制台上输出过菜单。这通常是一个do-while循环实现的,先输出菜单的每个选项,然后等待输入, 
    根据不同的输入执行不同的操作,然后循环再次输出菜单……。 
    bash中没有do-while风格的循环,但是我们很容易用替代的方案实现该功能。用死循环+if/case条件判断语句就够了。

    #!/bin/bash
    #菜单demo
    while :
    do
        echo   #输出空行
        echo "========================="
        echo "      1:输出成绩单"
        echo "      2:输出课程表"
        echo "      3:输出空闲教室"
        echo "      q:退出菜单"
        echo "========================="
        read -p"请输入:" input
        case $input in
            1)echo "稍等,正在为您输出成绩单";;
            2)echo "稍等,正在为您输出课程表";;
            3)echo "稍等,正在为您输出空闲教";;
            q|Q) exit
        esac
    done

    while与重定向

    while语句可以联合重定向(>和<)一起使用。

    while和输入重定向<

    格式为

    while 命令
    do
        循环体
    done < 文件名

    相当于将文件内容逐行传递给while后面的命令(类似管道),然后再执行循环体。 
    循环体为空的时候,这个结构的功能通常和cat没有两样,比如:

    while grep "love"
    do
    done < letter

    从文件letter中查找love这个单词,其实和cat letter|grep “love”没什么两样。

    这个结构更习惯的用法和read联用,来将文件内容逐行取出,赋值给read后面的变量。比如:

    #!/bin/bash
    #从/etc/passwd文件中读取用户名并输出
    oldIFS=$IFS #IFS是文件内部分隔符
    IFS=":"     #设置分隔符为:
    while  read username var #var变量不可少
    do
        echo "用户名:$username"
    done < /etc/passwd 
    IFS=$oldIFS

    熟悉/etc/passwd文件结构的朋友都知道这个文件的每一行包含了一个用户的大量信息(用户名只是第一项)。 
    这里我们实际只输出了用户名。但是注意while的read后面除变量username外还有个var,尽管我们并不输出这个变量的值。 
    但它却必不可少,如果我们写成while read username那么username的值等于passwd文件这一整行的内容(IFS=”:”也就不起作用了)

    bash中,只有当有多个变量要从一行文本赋值的时候,才尝试去用IFS来分割,然后赋值。

    while和输出重定向>

    格式为

    while 命令
    do
        循环体
    done > 文件名

    这个结构会将命令的输出,以及循环体中的标准输出都重定向到指定的文件中。 
    比如:

    #!/bin/bash
    #每隔10分钟,ping一下局域网内主机192.168.1.101,
    #并把结果记录到ping.txt文件中
    while date
    do
        ping -c5 192.168.1.101 >/dev/null 2>&1 
        if [ $? = 0 ];then
            echo OK
        else
            echo FAIL
        fi
        sleep 600 #600秒是10分钟
    done > ping.txt

    我们来cat一下ping.txt文件,看一看:

    2015年 01月 31日 星期六 16:03:13 CST
    OK

    这是ping.txt中的一条记录

    本系列(玩转Bash脚本)更多文章,请访问:http://blog.csdn.net/column/details/wanbash.html

    展开全文
  • 1. 前言微软已经在Win10一周年更新预览版中加入了Ubuntu Bash命令支持,相当于一个小型的linux系统,本来连接远程服务器的话,要使用putty啥的,现在可以用这个直接连接,我来讲讲步骤。2.步骤2.1 开启basha. 没安装...

    #1. 前言
    微软已经在Win10一周年更新预览版中加入了Ubuntu Bash命令支持,相当于一个小型的linux系统,本来连接远程服务器的话,要使用putty啥的,现在可以用这个直接连接,我来讲讲步骤。
    当然了,powershell功能也差不多,但是尝尝鲜嘛~
    #2.步骤
    ##2.1 开启bash
    a. 没安装Bash的用户可以按照如下方法开启,先在设置→更新和安全→针对开发人员中选择“开发人员模式”,点击后会自动下载“开发人员模式包”
    这里写图片描述

    b. 进入控制面板→程序和功能→启用或关闭Windows功能,勾选“适用于Linux的Windows子系统(Beta)”,点击“确定”
    这里写图片描述
    c. 重启电脑
    d. 打开cmd,输入lxrun /install /y 回车,然后就会开始安装了
    在这里插入图片描述
    e. 以后想进入bash,有以下几种方法

    ① win+r -> 输入 bash
    ② 打开cmd后,在输入bash回车
    ③ 小娜的搜索栏输入 bash 回车
    这里写图片描述

    ##2.2 ssh连接远程服务器
    ① 进入bash
    ② 输入ssh 用户名@域名/ip 回车
    ③ 输入服务器密码回车
    这里写图片描述

    ##2.3 上传文件到远程服务器
    ① 进入bash
    ② 传文件的话,输入 scp 文件 用户名@域名/ip:地址 ,比如我将桌面的1.txt传到服务器的/home/ubuntu/test 地址下,先进入桌面再如下代码

    scp 1.txt ubuntu@www.lixiufeng.me:/home/ubuntu/test
    

    这里写图片描述

    ③同理,传文件夹的话scp -r 文件夹 用户名@域名/ip:地址
    ④下载远程的文件 scp 用户名@域名/ip:远程文件的地址 本地地址
    ⑤ 下载远程的文件夹 scp -r 用户名@域名/ip:远程文件夹的地址 本地地址

    以后想卸载,可以在cmd里面输入 lxrun /uninstall /full
    在这里插入图片描述

    展开全文
  • Zsh和Bash究竟有何不同

    2018-07-12 11:03:30
    chsh -s /bin/bashchsh -s /bin/zsh已经有不少人写过类似“为什么Zsh比Bash好”“为什么Zsh比* shell好”的文章了,讲解如何配置Zsh或折腾各种oh-my-zsh主题的教程也是一搜一大箩,但是却极少看到Zsh和Bash这两个...

    chsh -s /bin/bash

    chsh -s /bin/zsh

    已经有不少人写过类似“为什么Zsh比Bash好”“为什么Zsh比* shell好”的文章了,讲解如何配置Zsh或折腾各种oh-my-zsh主题的教程也是一搜一大箩,但是却极少看到Zsh和Bash这两个Shell作为脚本语言时的具体差异比较。那么,这里就是一篇,从语言特性的角度上简单整理了两者一些细微的不兼容之处,供编写可移植Shell脚本时参考。(仅仅是从我自己过去的经验教训中总结出来的,所以应该也是不完全的。)

    开始之前:理解Zsh的仿真模式(emulation mode)

    一种流行的说法是,Zsh是与Bash兼容的。这种说法既对,也不对,因为Zsh本身作为一种脚本语言,是与Bash不兼容的。符合Bash规范的脚本无法保证被Zsh解释器正确执行。但是,Zsh实现中包含了一个屌炸天的仿真模式(emulation mode),支持对两种主流的Bourne衍生版shell(bash、ksh)和C shell的仿真(csh的支持并不完整)。在Bash的仿真模式下,可以使用与Bash相同的语法和命令集合,从而达到近乎完全兼容的目的。为了激活对Bash的仿真,需要显式执行:

    $ emulate bash 

    等效于:

    $ emulate sh 

    Zsh是不会根据文件开头的shebang(如#!/bin/sh#!/bin/bash)自动采取兼容模式来解释脚本的,因此,要让Zsh解释执行一个其他Shell的脚本,你仍然必须手动emulate sh或者emulate ksh,告诉Zsh对何种Shell进行仿真。

    那么,Zsh究竟在何时能够自动仿真某种Shell呢?

    对于如今的绝大部分GNU/Linux(Debian系除外)和Mac OS X用户来说,系统默认的/bin/sh指向的是bash

    $ file /bin/sh
    /bin/sh: symbolic link to `bash' 

    不妨试试用zsh来取代bash作为系统的/bin/sh

    # ln -sf /bin/zsh /bin/sh 

    所有的Bash脚本仍然能够正确执行,因为Zsh在作为/bin/sh存在时,能够自动采取其相应的兼容模式(emulate sh)来执行命令。也许正是因为这个理由,Grml直接选择了Zsh作为它的/bin/sh,对现有的Bash脚本能做到近乎完美的兼容。

    无关主题:关于/bin/sh和shebang的可移植性

    说到/bin/sh,就不得不提一下,在Zsh的语境下,sh指的是大多数GNU/Linux发行版上/bin/sh默认指向的bash,或者至少是一个Bash的子集(若并非全部GNU Bash的最新特性都被实现的话),而非指POSIX shell。因此,Zsh中的emulate sh可以被用来对Bash脚本进行仿真。

    众所周知,Debian的默认/bin/sh是 dash(Debian Almquist shell),这是一个纯粹POSIX shell兼容的实现,基本上你要的bash和ksh里的那些高级特性它都没有。“如果你在一个#!/bin/sh脚本中用到了非POSIX shell的东西,说明你的脚本写得是错的,不关我们发行版的事情。”Debian开发者们在把默认的/bin/sh换成dash,导致一些脚本出错时这样宣称道。当然,我们应该继续假装与POSIX shell标准保持兼容是一件重要的事情,即使现在大家都已经用上了更高级的shell。

    因为有非GNU的Unix,和Debian GNU/Linux这类发行版的存在,你不能够假设系统的/bin/sh总是GNU Bash,也不应该把#!/bin/sh用作一个Bash脚本的shebang(——除非你愿意放弃你手头Shell的高级特性,写只与POSIX shell兼容的脚本)。如果想要这个脚本能够被方便地移植的话,应指定其依赖的具体Shell解释器:

    #!/usr/bin/env bash 

    这样系统才能够总是使用正确的Shell来运行脚本。

    (当然,显式地调用bash命令来执行脚本,shebang怎样写就无所谓了)


    echo命令 / 字符串转义

    Zsh比之于Bash,可能最容易被注意到的一点不同是,Zsh中的echoprintf是内置的命令。

    $ which echo
    echo: shell built-in command
    
    $ which printf
    printf: shell built-in command 

    Bash中的echoprintf同样是内置命令:

    $ type echo
    echo is a shell builtin
    
    $ type printf
    echo is a shell builtin 

    感谢读者提醒,在Bash中不能通过which来确定一个命令是否为外部命令,因为which本身并不是Bash中的内置命令which在Zsh中是一个内置命令。

    Zsh内置的echo命令,与我们以前在GNU Bash中常见的echo命令,使用方式是不兼容的。

    首先,请看Bash:

    $ echo \\
    \
    
    $ echo \\\\
    \\ 

    我们知道,因为这里传递给echo的只是一个字符串(允许使用反斜杠\转义),所以不加引号与加上双引号是等价的。Bash输出了我们预想中的结果:每两个连续的\转义成一个\字符输出,最终2个变1个,4个变2个。没有任何惊奇之处。

    你能猜到Zsh的输出结果么?










    $ echo \\
    \
    
    $ echo \\\\
    \ 

    (゜Д゜*)

    解释稍后。

    我们还知道,要想避免一个字符串被反斜杠转义,可以把它放进单引号。正如我们在Bash中所清楚看到的这样,所有的反斜杠都照原样输出:

    $ echo '\\'
    \\
    
    $ echo '\\\\'
    \\\\ 

    再一次,你能猜到Zsh的输出结果么?










    $ echo '\\'
    \
    
    $ echo '\\\\'
    \\ 

    ((((((゜Д゜*))))))))))))

    这个解释是这样的:在前一种不加引号(或者加了双引号)的情形下,传递给echo内部命令的字符串将首先被转义,echo \\中的\\被转义成\echo \\\\中的\\\\被转义成\\。然后,在echo这个内部命令输出到终端的时候,它还要把这个东西再转义一遍,一个单独的\没法转义,所以仍然是作为\输出;连续的\\被转义成\,所以输出就是\。因此,echo \\echo \\\\的输出相同,都是\

    为了让Zsh中echo的输出不被转义,需要显式地指明-E选项:

    $ echo -E \\
    \
    
    $ echo -E \\\\
    \\ 

    于是,我们也就知道在后一种加单引号的情形下,如何得到与原字符串完全相同的输出了:

    $ echo -E '\\'
    \\
    
    $ echo -E '\\\\'
    \\\\ 

    而Bash的echo默认就是不对输出进行转义的,若要得到转义的效果,需显式地指定-e选项。Bash和Zsh中echo命令用法的不兼容,在这里体现出来了。

    变量的自动分字(word splitting)

    在Bash中,你可以通过调用外部命令echo输出一个字符串:

    echo $text 

    我们知道,Bash会对传递给命令的字符串进行分字(根据空格或换行符),然后作为多个参数传给echo。当然,作为分隔符的换行,在最终输出时就被抹掉了。于是,更好的习惯是把变量名放在双引号中,把它作为一个字符串传递,这样就可以保留文本中的换行符,将其原样输出。

    echo "$text" 

    在Zsh中,你不需要通过双引号来告诉解释器“$text是一个字符串”。解释器不会把它转换成一个由空格或者\n分隔的参数列表或者别的什么。所以,没有Bash中的trick,直接echo $text就可以保留换行符。但是,如前一节所说,我们需要一个多余的工作来保证输出的是未转义的原始文本,那就是-E选项:

    echo -E $text 

    从这里我们看到,Zsh中的变量在传递给命令时是不会被自动切分成words然后以多个参数的形式存在的。它仍然保持为一个量。这是它与传统的Bourne衍生shell(ksh、bash)的一个重要不兼容之处。这是Zsh的特性,而不是一个bug

    通配符展开(globbing)

    通配符展开(globbing)也许是Unix shell中最为实用化的功能之一。比起正则表达式,它的功能相当有限,不过它的确能满足大部分时候的需求:依据固定的前缀或后缀匹配文件。需要更复杂模式的时候其实是很少见的,至少在文件的命名和查找上。

    Bash和Zsh对通配符展开的处理方式有何不同呢?举个例子,假如我们想要列举出当前目录下所有的.markdown文件,但实际上又不存在这样的文件。在Zsh中:(注意到这里使用了内置的echo,因为我们暂时还不想用到外部的系统命令)

    $ echo *.markdown
    zsh: no matches found: *.markdown 

    Bash中:

    $ echo *.markdown
    *.markdown 

    Zsh因为通配符展开失败而报错;而Bash在通配符展开失败时,会放弃把它作为通配符展开、直接把它当做字面量返回。看起来,Zsh的处理方式更优雅,因为这样你就可以知道这个通配符确实无法展开;而在Bash中,你很难知道究竟是不存在这样的文件,还是存在一个文件名为'*.markdown'的文件。

    接下来就是不那么和谐的方面了。

    在Zsh中,用ls查看当然还是报错:

    $ ls *.markdown
    zsh: no matches found: *.markdown 

    Bash,这时候调用ls也会报错。因为当前目录下没有.markdown后缀的文件,通配符展开失败后变成字面的'*.markdown',这个文件自然也不可能存在,所以外部命令ls报错:

    $ ls *.markdown
    ls: cannot access *.markdown: No such file or directory 

    同样是错误,差别在哪里?对于Zsh,这是一个语言级别的错误;对于Bash,这是一个外部命令执行的错误。这件差别很重要,因为它意味着后者可以被轻易地catch,而前者不能。

    想象一个常见的命令式编程语言,Java或者Python。你可以用try...catch或类似的语言结构来捕获运行时的异常,比较优雅地处理无法预料的错误。Shell当然没有通用的异常机制,但是,你可以通过检测某一段命令的返回值来模拟捕获运行时的错误。例如,在Bash里可以这样:

    $ if ls *.markdown &>/dev/null; then :; else echo $?; fi
    2 

    于是,在通配符展开失败的情形下,我们也能轻易地把外部命令的错误输出重定向到/dev/null,然后根据返回的错误码执行后续的操作。

    不过在Zsh中,这个来自Zsh解释器自身的错误输出却无法被重定向:

    $ if ls *.markdown &>/dev/null; then :; else echo $?; fi
    zsh: no matches found: *.markdown
    1 

    大部分时候,我们并不想看到这些丑陋多余的错误输出,我们期望程序能完全捕获这些错误,然后完成它该完成的工作。但这也许是一种正常的行为。理由是,在程序语言里,syntax error一般是无法简单地由用户在运行阶段自行catch的,这个报错工作将直接由解释器来完成。除非,当然,除非我们用了邪恶的eval

    $ if eval "ls *.markdown" &>/dev/null; then :; else echo $?; fi
    1 

    Eval is evil. 但在Zsh中捕获这样的错误,似乎没有更好的办法了。必须这么做的原因就是:Zsh中,通配符展开失败是一个语法错误。而在Bash中则不是。

    基于上述理由,依赖于Bash中通配符匹配失败而直接把"*"当作字面量传递给命令的写法,在Zsh中是无法正常运行的。例如,在Bash中你可以:(虽然在大部分情况下能用,但显然不加引号是不科学的)

    $ find /usr/share/git -name *.el 

    因为Zsh不会在glob扩展失败后自动把"*"当成字面量,而是直接报错终止运行,所以在Zsh中你必须"*.el"加上引号,来避免这种扩展:

    $ find /usr/share/git -name "*.el" 

    字符串比较

    在Bash中判断两个字符串是否相等:

    [ "$foo" = "$bar" ] 

    或与之等效的(现代编程语言中更常见的==比较运算符):

    [ "$foo" == "$bar" ] 

    注意等号左右必须加空格,变量名一定要放在双引号中。(写过Shell的都知道这些规则的重要性)

    在条件判断的语法上,Zsh基本和Bash相同,没有什么改进。除了它的解释器想得太多,以至于不小心把==当做了一个别的东西:

    $ [ foo == bar ]; echo $?
    zsh: = not found 

    要想使用我们最喜欢的==,只有把它用引号给保护起来,不让解释器做多余的解析:

    $ [ foo "==" bar ]; echo $?
    1 

    所以,为了少打几个字符,还是老老实实用更省事的=吧。

    数组

    同样用一个简单的例子来说明。Bash:

    array=(alpha bravo charlie delta) echo $array echo ${array[*]} echo ${#array[*]} for ((i=0; i < ${#array[*]}; i++)); do  echo ${array[$i]} done 

    输出:

    alpha
    alpha bravo charlie delta
    4
    alpha
    bravo
    charlie
    delta 

    很容易看到,Bash的数组下标是从0开始的$array取得的实际上是数组的第一个元素的值,也就是${array[0]}(这些行为和C有点像)。要想取得整个数组的值,必须使用${array[*]}${array[@]},因此,获取数组的长度可以使用${#array[*]}。在Bash中,必须记得在访问数组元素时给整个数组名连同下标加上花括号,比如,${array[*]}不能写成$array[*],否则解释器会首先把$array当作一个变量来处理。

    再来看这段Zsh:

    array=(alpha bravo charlie delta) echo $array echo $array[*] echo $#array for ((i=1; i <= $#array[*]; i++)); do  echo $array[$i] done 

    输出:

    alpha bravo charlie delta
    alpha bravo charlie delta
    4
    alpha
    bravo
    charlie
    delta 

    在Zsh中,$array$array[*]一样,可以用来取得整个数组的值。因此获取数组的长度可直接用$#array

    Zsh的默认数组下标是从1而不是0开始的,这点更像C shell。(虽然一直无法理解一个名字叫C的shell为何会采用1作为数组下标开始这种奇葩设定)

    最后,Zsh不需要借助花括号来访问数组元素,因此Bash中必需的花括号都被略去了。

    关联数组

    Bash 4.0+和Zsh中都提供了对类似AWK关联数组的支持。

    declare -A array
    array[mort]=foo 

    和普通的数组一样,在Bash中,必须显式地借助花括号来访问一个数组元素:

    echo ${array[mort]} 

    而Zsh中则没有必要:

    echo $array[mort] 

    说到这里,我们注意到Zsh有一个不同寻常的特性:支持使用方括号进行更复杂的globbingarray[mort]这样的写法事实上会造成二义性:究竟是取array这个关联数组以mort为key的元素值呢,还是以通配符展开的方式匹配当前目录下以"array"开头,以"m""o""r""t"任一字符结尾的文件名呢?

    array[mort]=作为命令开始的情况下,不存在歧义,这是一个对关联数组的赋值操作。在前面带有$的情况下,Zsh会自动把$array[mort]识别成取关联数组的值,这也没有太大问题。问题出在它存在于命令中间,却又不带$的情况,比如:

    read -r -d '' array[mort] << 'EOF' hello world EOF 

    我们的本意是把这个heredoc赋值给array[mort]数组元素。在Bash中,这是完全合法的。然而,在Zsh中,解释器会首先试图对"array[mort]"这个模式进行glob展开,如果当前目录下没有符合该模式的文件,当然就会报出一个语法错误:

    zsh: no matches found: array[mort] 

    这是一件很傻的事情,为了让这段脚本能够被Zsh解释器正确执行,我们需要把array[mort]放在引号中以防止被展开:

    read -r -d '' 'array[mort]' << 'EOF' hello world EOF 

    这是Zsh在扩展了一些强大功能的同时带来的不便之处(或者说破坏了现有脚本兼容性的安全隐患,又或者是让解释器混乱的pitfalls)。

    顺便说一句,用Rake构建过项目的Rails程序员都知道,有些时候需要在命令行下通过方括号给rake传递参数值,如:

    $ rake seeder:seed[100] 

    Zsh这个对方括号展开的特性确实很不方便。如果不想每次都用单引号把参数括起来,可以完全禁止Zsh对某条命令后面的参数进行glob扩展:(~/.zshrc

    alias rake="noglob rake" 

    嗯,对于rake命令来说,glob扩展基本是没有用的。你可以关掉它。

    分号与空语句

    虽然有点无聊,但还是想提一下:Bash不允许语句块中使用空语句,最小化的语句是一个noop命令(:);而Zsh允许空语句

    刚开始写Bash的时候,总是记不得什么时候该加分号什么时候不该加。比如

    if [ 1 ] then : fi 

    如果放在一行里写,应该是

    if [ 1 ]; then :; fi 

    then后面是不能接分号的,如果写成

    if [ 1 ]; then; :; fi 

    就会报错:

    bash: syntax error near unexpected token `;' 

    解释是:then表示一个代码段的开始,fi表示结束,这中间的内容必须是若干行命令,或者以分号;结尾的放在同一行内的多条命令。我们知道在传统的shell中,分号本身并不是一条命令,空字符串也不是一条命令,因此,then后面紧接着的分号就会带来一条语法错误。(有些时候对某个“语言特性”的所谓解释只是为了掩饰设计者在一开始犯的错误,所以就此打住)

    在Zsh中,上述两种写法都合法。因为它允许只包含一个分号的空命令。

    $ ; 

    当然,因为分号只是一个语句分隔符,所以没有也是可以的。这种写法在Zsh中合法:(then的语句块为空)

    if [ 1 ]; then fi 

    第二弹

    其实只是先挖个坑而已。我也不知道有没有时间写,暂且记上。

    Zsh vs. Bash:不完全对比解析(2)

    • 别名,函数定义和作用域
    • 协进程(coprocess)
    • 重定向
    • 信号和陷阱(trap)

    转自 https://www.xshell.net/shell/bash_zsh.html

    展开全文
  • 在众多Linux发行版中bash shell 可谓是随处可见。作为众多发行版的首选shell,对于bash shell的学习对我们来说,显得格外重要。在学习bash shell的过程中,bash、sh、source及英文输入状态下的点号经常交替出现,...
  • 关于LINUX权限-bash: ./startup.sh: Permission denied <script type="text/javascript"></script><script type="text/javascript"></script> 在执行./startup.sh,或者./shutdown.sh的时候,爆出了...
  • zsh切换bash bash切换zsh

    2015-10-05 20:00:50
    zsh切换bash bash切换zsh 切换bash chsh -s /bin/bash 切换zsh chsh -s /bin/zsh
  • 这一两刚刚下载Git Bash,跟着慕课网学习node.js。在视屏中用Git Bash时复制一段代码,我试着写,结果发现根本用不了Ctrl+C和Ctrl+V来复制和粘贴。我就上网找,网上的答案都是在Git Bash的options(选项)里的...
  • Linux Bash Shell入门教程

    2018-05-24 17:00:08
    BASH 的基本语法最简单的例子 —— Hello World!关于输入、输出和错误输出BASH 中对变量的规定(与 C 语言的异同)BASH 中的基本流程控制语法函数的使用2.1 最简单的例子 —— Hello World!几乎所有的讲解编程的书...
  • 0x00 前言 文章中的文字可能存在语法错误以及...1.前几次还好用的命令,这次再输入就出现-bash: ***: command not found的情况; 2.第一次使用就出现 -bash: ** : command not found的情况。 导致这种问题的原...
  • 当我们使用 sh test.sh 、bash test.sh 、 ./test.sh 运行脚本都会使用一个新的shell环境来执行脚本内的命令, 当子进程完成后,子进程内的各项变量和操作将会结束而不会传回到父进程中。 source方法执行脚本是在父...
  • linux -bash-4.2#问题

    2019-01-25 13:12:49
    因为删除了root的家目录下的文件,导致了-bash-4.2#问题。 原因是root在/root下面的几个配置文件丢失,丢失文件如下:   1、.bash_profile   2、.bashrc   以上这些文件是每个用户都必备的文件。   使用...
  • sh和bash的区别

    2017-08-12 00:14:03
    sh是一种POSIX标准,它有很多种实现,包括ksh88, dash,bash等。因为sh是一种规范,并不是实现,所以/bin/sh实际上是一个硬链接,链接到某种实现上。大多数情况下,/bin/sh会链接到/bin/bash。所以你执行sh xx.sh ...
  • 我使用过的Linux命令之for - Bash中的For循环 本文链接:http://codingstandards.iteye.com/blog/778999 (转载请注明出处)   用途说明 在shell中用于循环。类似于其他编程语言中的for,但又有些不同。for循环是...
  • 开启了win10中的内置Linux Bash后,可以通过小娜输入bash点击进行启动,但是在启动时遇到了bash闪退问题。现在给出两种解决方法,如下。 方法一 使用win+r组合键打开命令提示符窗口,右键点击窗户标题栏,选择属性,...
  • 彻底理解bash反弹shell

    2019-03-19 14:30:02
    bash反弹:首先公网主机监听指定端口,然后肉鸡执行bash命令向公网指定端口发送连接请求 公网主机: nc -lvvp 9090 肉鸡执行: bash -i &amp;&gt; /dev/tcp/144.34.164.217/9090 0&gt;&amp;1 ...
  • AIX下安装bash

    2016-04-25 23:22:23
    大家估计对AIX的Shell都深有体会,默认情况下AIX用的并非是bash而是ksh,这对经常使用bash的人来说非常不习惯,Linux的bash能实现自动补全,按上下键获取历史命令,而AIX下的ksh却没有这些功能,不过AIX是可以安装...
  • zsh与bash区别

    2020-03-03 22:03:44
    zsh与bash区别 1. 两者之间比较 2. 配置zsh   1. 两者之间比较        zsh越来越受更多人欢迎,号称“终极shell”,所以想去了解下它的过人之处,总之,从一个交互式终端...
  • Bash脚本的执行方式可以分为两类: 1. 通过绝对路径、相对路径或者bash命令来执行。 该方法是在子进程的bash内来执行脚本的,脚本中的操作只能在子进程的bash环境中生效,不会对父进程的bash环境产生任何影响。 2. ...
1 2 3 4 5 ... 20
收藏数 637,370
精华内容 254,948
关键字:

bash