AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 729101
Accepted
arcomber
arcomber
Asked: 2022-12-21 05:40:14 +0800 CST2022-12-21 05:40:14 +0800 CST 2022-12-21 05:40:14 +0800 CST

如何在命令行的bash中输入多行命令

  • 772

我正在对脚本进行故障排除,我想逐行手动输入每一行以查找错误。

我的脚本有一个 if 语句:

if [ -d dir1 ]; then
    rm -rf dir1
fi

所以我试着输入一行命令

$ if [ -d dir1 ]; then rm -rf dir1 fi
> 

我尝试了 Ctrl-D 但随后收到消息:bash:语法错误:文件意外结束

那么如何在命令行输入这个if语句呢?

bash
  • 2 2 个回答
  • 602 Views

2 个回答

  • Voted
  1. Best Answer
    John
    2022-12-21T05:48:59+08:002022-12-21T05:48:59+08:00

    简短回答:您需要在 . 之后加一个分号rm -rf dir1。

    查看实际效果:if完全按照脚本中显示的方式输入块:

    $ if [ -d dir1 ]; then
    >     rm -rf dir1
    > fi
    

    运行后,使用向上箭头回调最后一个命令,它会if在一行上显示整个块:

    $ if [ -d dir1 ]; then rm -rf dir1; fi
    

    shell 需要某种方式来解释 if 块内命令之间的中断。它不能简单地将其视为一次执行的单个命令,因此分号用作这些中断。

    • 15
  2. mirabilos
    2022-12-22T12:36:09+08:002022-12-22T12:36:09+08:00

    除了约翰的回答,这是完全正确的,但仍然会以你输入一个(很长的)单行命令而告终,还有一种输入多行命令的实际方法:

    $ if [ -d dir1 ]; then
    >         rm -rf dir1
    > fi
    

    那就是……只是打字。Enter 后,shell 将看到命令未完成并提供“继续提示”。

    但是,如果命令实际上是完整的,或者您不想依赖它怎么办?也有可能。

    它称为 VLNEXT,通常设置为^V,但如果您想真正确定,请检查stty -a输出并lnext在 cchars 组中查找(在 BSD 上;GNU stty 是一个相当未分类的输出,但对我来说它在第三行)。

    作为一个额外的复杂性,在熟化模式下,Enter 键提交^M(ASCII 0x0D)但我们实际上需要 ASCII 0x0A,^J所以你必须用 VLNEXT 按下它。

    然后,我们可以输入if [ -d dir1 ]; then^V^Jrm -rf dir1^V^JfiEnter,它将作为一个大命令运行。在 GNU bash中看起来像这样……

    $ if [ -d dir1 ]; then
    rm -rf dir1
    fi
    

    …当按下↑查看历史记录时,您会看到它实际上保存了带有分号的单行表格。

    其他 shell 的显示方式可能有所不同——例如,mksh在输入时会这样显示……

    $ if [ -d dir1 ]; then^Jrm -rf dir1^Jfi
    

    ......如果你按下↑你会看到它保存它就像在历史中一样。如果按←几次,您会注意到这些^J被视为单个字符,因为它实际上是一个控制字符,而不是两个字符^(插入符号)和J.

    因此,GNU bash 将具有更好的输入,但在内部对其进行转换,而 mksh 具有单行输入(和命令行编辑),但将其保留在历史记录中,与输入的完全一样。

    在zsh中,输入时看起来像多行 bash……

    % if [ -d dir1 ]; then
    rm -rf dir1
    fi
    

    …这也存储在历史记录中(就像在 mksh 中一样,但是 zsh 具有多行输入编辑功能,因此可以负担得起将光标上下移动,从而将其扩展^J为实际的换行符;但这有缺点,尽管, 按下^U不再杀死整个输入,而是只杀死其中的一个子行)。

    yash的行为类似于 1999 年的pdksh,因为它^J在一行中输入(就像 mksh 一样)但是将每一行单独保存到历史记录中,所以↑你得到的只是最后一个fi,这可能非常没有帮助。

    现代(Debian stable/bullseye)破折号在这里表现得像 mksh。

    现代 AT&T ksh93 ksh “u+m” 甚至更奇怪:在输入时,它的行为类似于它在 pdksh/mksh 血统中的表兄弟,但是当按下↑它时(仅)获取命令的第一行(而不是像 pdksh 那样的最后一行)做了),这可能也不是很有帮助。

    tcsh是……奇怪的。因为^V^J它显示^M内联(但除此之外的行为与 mksh 类似,当然,因为它不是 POSIX 兼容的 shell,该if命令将因语法错误而失败),而对于^V^M和^VEnter,它的行为就像只是按下 Enter 一样。

    > if [ -d dir1 ]; then^Mrm -rf dir1^Mfi
    if: Expression Syntax.
    rm: Command not found.
    

    最后,原来的csh ……

    % if [ -d dir1 ]; then^Jrm -rf dir1^Jfi
    if: Expression Syntax.
    

    ......那里没有惊喜。它没有交互式的方式来检索历史记录,并且发出history命令以显示已保存的行没有输出(即使是简单的ls),所以我相信它需要启用一些设置或其他东西(我从未使用过系列C 壳)。

    全面披露:我是 mksh 开发人员。

    • 3

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve