标签: bash

如何在 Bash 中方便地使用单引号或转义整个命令行?

介绍

考虑这样的工具watch可以接受另一个命令(例如ls -l),如下所示:

watch ls -l
# or equivalently
watch 'ls -l'
Run Code Online (Sandbox Code Playgroud)

如果命令更复杂,那么如果当前 shell 或 get 解释诸如$variable*|;之类的内容,那么一切都与引用/转义有关。这两个命令是不同的:&&watch

watch echo "$$"
watch 'echo "$$"'
Run Code Online (Sandbox Code Playgroud)

这些也是:

watch date ; echo done
watch date \; echo done
Run Code Online (Sandbox Code Playgroud)

ssh类似,它可以接受一个或多个参数并构建一个要在服务器上运行的命令。如果本地 shell 解释等,或者远程 shell 则$variable取决于引用/转义。|

有些命令sh -c需要包含代码的单个参数,但引用/转义的需求是相似的。事实上watch(或ssh) 为sh -c或类似的命令构建了这个单一参数。


问题

我已经有了想要提供给或或类似工具的确切命令。命令是从历史记录中获取的,或者粘贴到命令行中或者键入,就像要直接执行一样;它逐字在我的命令行中。在使用类似工具之前,不应扩展或解释命令中的任何内容。如果是这样,则意味着所有扩展和解释都应该稍后定期进行。如果是这样,则意味着它应该发生在服务器上。watchsshwatchwatchssh …

bash command-line escaping

6
推荐指数
1
解决办法
3215
查看次数

#!/bin/sh -x 这行中的“x”是什么意思?

您能解释一下 shebang #!/bin/sh -x 中“x”的含义吗?

这行有必要加“-x”吗?

linux script bash sh shebang

6
推荐指数
1
解决办法
1万
查看次数

Journalctl 仅显示大约过去一小时的日志

我的日志有问题journalctl,它没有显示超过一小时的日志。

第一个日志条目大约是一小时前,而不是要求的 2 天前。

$ date -u
Wed May 13 08:59:21 UTC 2020
$ sudo journalctl --utc --since="2 days ago" -n 1 --no-pager -u datalake-profile-table-error-worker@1.service
-- Logs begin at Tue 2020-03-17 17:30:22 UTC, end at Wed 2020-05-13 09:00:10 UTC. --
May 13 08:11:03 <log content>
Run Code Online (Sandbox Code Playgroud)

服务已于 5 天前开通:

$ sudo systemctl status  datalake-profile-table-error-worker@1.service
...
   Active: active (running) since Thu 2020-05-07 15:45:47 CEST; 5 days ago
...
Run Code Online (Sandbox Code Playgroud)

jorunalctd.conf不过看起来并不可疑:

$ cat /etc/systemd/journald.conf
#  This file is part of systemd. …
Run Code Online (Sandbox Code Playgroud)

linux bash logging systemd

6
推荐指数
1
解决办法
2万
查看次数

Windows 中 git-bash.exe 和 sh.exe 有什么区别?

我想将 git bash 集成到 IntelliJ 中,因此我将默认终端路径更改为C:\Program Files\Git\bin\sh.exe. 一段时间后,我注意到有些命令不起作用,例如:

sh.exe

$ ll                                                                                                                    
bash: ll: command not found
Run Code Online (Sandbox Code Playgroud)

还有一些程序无法运行。我正在使用MQTT CLI,下载了它,PATH正确配置了变量,但该命令mqtt仅在git-bash.exe.

sh.exe

$ mqtt
bash: mqtt: command not found
Run Code Online (Sandbox Code Playgroud)

git-bash.exe

$ mqtt

Usage:  mqtt [-hV] { pub | sub | shell }

MQTT Command Line Interpreter.

Options:
  -h, --help      Show this help message and exit.
  -V, --version   Print version information and exit.

Commands:
  pub, publish    Publish a message to a list of topics …
Run Code Online (Sandbox Code Playgroud)

windows bash command-line git-bash

6
推荐指数
1
解决办法
1万
查看次数

无需获取 .bashrc 的 SSH

.bashrc我在通过 SSH 远程登录到服务器时正在试验我的文件。我无意中留下了一个exit,导致所有后续登录立即断开连接。我实际上被锁在门外了。我能够在具有 root 权限的人的干预下恢复访问权限,但是如果没有其他人的帮助,这可能吗?

我尝试做诸如运行ssh <server> 'bash --norc --noprofile'和 之类的事情ssh <server> 'mv .bashrc bashrc-backup',甚至尝试用 强制覆盖它scp empty-file <server>:.bashrc。然而,所有这些选项似乎都依赖于.bashrc在运行命令之前首先找到损坏的源,因此它们都不起作用。

很可能这种情况是没有办法摆脱的。但这是设计使然吗?为什么很容易将自己锁定在系统之外,例如仅通过运行,是否有原因ssh <server> 'echo exit > .bashrc'?有没有办法减少这种错误?

linux ssh terminal bash bashrc

6
推荐指数
1
解决办法
5630
查看次数

如何在 ZSH 中的另一个别名中使用别名?

假设我的 ZSH 配置文件中有以下别名定义:

alias myalias="cd /"
Run Code Online (Sandbox Code Playgroud)

如何myalias在另一个别名中使用?IE:

alias myaliasone="myalias && cd /usr"
Run Code Online (Sandbox Code Playgroud)

我已经尝试过(使用真正的别名,这个别名只是为了示例目的而伪造的),但没有任何反应,而且我无法根据调试或修复某些内容看到任何错误,有什么想法吗?如果这是在另一个别名中使用别名的正确方法,您知道我如何调试它以便找到根本问题或发生了什么吗?

bash zsh bash-alias

6
推荐指数
1
解决办法
3027
查看次数

如何在linux alpine中为整个机器添加PATH变量的路径?

我知道我可以在当前会话中export PATH="$PATH:my_path"添加PATH变量。

我还知道我可以添加此行以~/.bash_profile使其在用户的会话中持续存在:

echo 'PATH="$PATH:my_path"' >> ~/.bash_profile

我还知道在 Linux 中ubuntu我可以添加该行/etc/bash.bashrc,并且它始终可供所有用户使用。

但是,我的 linux 在容器内alpine,我不知道在哪里添加该文件。我在谷歌中找不到它。

linux bash path environment-variables alpine-linux

6
推荐指数
1
解决办法
2万
查看次数

在 Bash 和 ZSH 中读取

在 macOS 上使用 read 时,我观察到 zsh 和 bash 之间的差异。

使用 bash 这个脚本

echo "characters" | while IFS= read -d '' -n 1 a; do printf %s "$a-"; done
Run Code Online (Sandbox Code Playgroud)

生产

c-h-a-r-a-c-t-e-r-s-
Run Code Online (Sandbox Code Playgroud)

而在 zsh 上我没有输出,也没有错误是否可以使用 read 逐个字符地迭代?

script bash zsh read

6
推荐指数
1
解决办法
3771
查看次数

将条件表达式的结果分配给环境变量

我想将条件表达式的结果存储在环境变量中。

我试过:

C=$([ "$A" = "$B" ])
Run Code Online (Sandbox Code Playgroud)

但运行后的值为$C空字符串。

我当然可以做这样的事情:

if [ "$A" = "$B" ]
then
  C=1
else
  C=0
fi
Run Code Online (Sandbox Code Playgroud)

但我确信有更好的方法。

bash shell environment-variables

6
推荐指数
1
解决办法
4811
查看次数

重定向:额外的单词是如何进入文件的?

我正在测试一个脚本,想创建一个包含一些文本的小文件,所以我输入了以下内容,但忘记对文件名中的空格进行转义:

echo "bob">other name
Run Code Online (Sandbox Code Playgroud)

当我这样做时ls,它显示了文件“其他”,当我这样做时cat other,它显示的内容为:

bob name
Run Code Online (Sandbox Code Playgroud)

“名称”是如何出现在文件中的?我相信我在某处看到您可以在命令中的任何位置放置重定向。事实上,我刚刚测试了这个:

echo >other Some text in a file
Run Code Online (Sandbox Code Playgroud)

“文件中的某些文本”是“其他”的内容。

此功能的目的是什么?

当然,最初,我应该输入:

echo "bob">other\ name
Run Code Online (Sandbox Code Playgroud)

bash redirection

5
推荐指数
1
解决办法
201
查看次数