标签: bash

bash 如何测试“假”?

$ false
$ echo $?
1

$ if [[ false ]]; then echo 'do it'; fi
do it

$ test false && echo 'do it'
do it

$ COND=false
$ echo $COND
false
$ if [[ $COND -ne 0 ]]; then echo 'do it'; fi
$ if [[ $COND -ne true ]]; then echo 'do it'; fi
Run Code Online (Sandbox Code Playgroud)

这是废话 IMO,我在这里错过了什么?

- 更新

所以下面是它的过程:

$ COND=false
$ if ! $COND; then echo 'do it'; fi
do it
$ if $COND; then echo …
Run Code Online (Sandbox Code Playgroud)

linux bash conditional-statements

4
推荐指数
1
解决办法
8541
查看次数

bash:服务:找不到命令

我在运行mysql命令时遇到了问题,并在网上看到了一些建议使用该service命令的问题的建议,似乎这是我默认应该拥有的东西。

我一直在安装一些自制程序包,所以我不确定这是否可能导致它?我以前从未使用过这个命令,所以我不完全确定。

尝试运行命令sudo service mysql start 返回

sudo: service: command not found
Run Code Online (Sandbox Code Playgroud)

我没有太多使用终端的经验,所以很抱歉。我看到很多评论表明服务命令位于/usr/sbin/并且也可能位于,/sbin/service但我在两者中都找不到它。

我的 .bash_profile 如下

export PATH=~/.composer/vendor/bin:$PATH
export PATH=/usr/local/php5/bin:$PATH
export ANDROID_HOME=$HOME/Library/Android/sdk
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/tools/bin
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:/home/user/bin
export PATH=$PATH:/sbin
Run Code Online (Sandbox Code Playgroud)

底部的两个导出来自其他问题的建议,但似乎都不起作用。

有任何想法吗?任何帮助将不胜感激。

mac bash .bash-profile macos

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

使用通配符递归运行`ls`

我正在尝试使用以下命令查找特定文件类型的所有项目文件:

ls -ltR *.mb
Run Code Online (Sandbox Code Playgroud)

我知道在几个文件夹中有我想要的文件,但我没有得到任何结果。我做错了什么?

linux bash ls wildcards

4
推荐指数
1
解决办法
4753
查看次数

将 vi 模式字符串移动到 bash 提示符的末尾

我在 bash 中使用 vi 编辑模式。我在 ~/.inputrc 中将“show-mode-in-prompt”设置为“on”。

显示模式提示(关闭)

如果设置为 On,则在提示开头添加一个字符串,指示编辑模式:emacs、vi 命令或 vi 插入。模式字符串是用户可设置的(例如,emacs-mode-string)。

所以现在我可以在我的提示开头看到编辑模式。

i:$ # This is ins mode
c?$ # This is cmd mode
i:$ cat ~/.inputrc
set editing-mode vi
set show-mode-in-prompt on
set vi-ins-mode-string "\1\e[1;32m\2i:\1\e[0m\2"
set vi-cmd-mode-string "\1\e[1;31m\2c?\1\e[0m\2"
set colored-stats on
i:$ echo $PS1
$
Run Code Online (Sandbox Code Playgroud)

不过,我真的很喜欢在我的提示末尾添加这个,并在当前目录前面加上,即

/current/dir/here $ i:
Run Code Online (Sandbox Code Playgroud)

但我不确定这是否可以实现。我的第一个想法是在 PS1 中使用回车,但不幸的是这会覆盖模式字符串。

i:$ PS1='\r\w $ '
~/projects $
Run Code Online (Sandbox Code Playgroud)

我的第二个想法是以某种方式获取模式字符串并将其插入 $PROMPT_COMMAND,而不是让 readline 将其写入提示。我可以通过以下方式获取当前模式:

i:$ bind -v | grep keymap | awk '{print $3}'
vi-insert
Run Code Online (Sandbox Code Playgroud)

但是 PROMPT_COMMAND 值仅在发出提示之前执行,因此我不会看到模式更改。

第 …

bash command-line prompt readline inputrc

4
推荐指数
1
解决办法
937
查看次数

文件重定向与 dd

假设我想将某个命令的输出通过管道传输到一个文件中。简单地……好吧,将它传送到一个文件,例如

some-command > file
Run Code Online (Sandbox Code Playgroud)

和管道它通过dd

some-command | dd $MAYBE_SOME_OPTIONS_LIKE_BS of=file
Run Code Online (Sandbox Code Playgroud)

这个问题主要是为了满足我的好奇心,除非后一种形式有一些不可忽视的好处或用例,否则在实践中我会省去练习并选择前者。

bash dd pipe

4
推荐指数
1
解决办法
326
查看次数

crontab 作业日志消息显示来自 mta#012 的错误状态 0x004b

crontab当我尝试检查我的 crontab 作业时,作业日志消息显示来自 mta#012 的错误状态 0x004b。

# grep CRON /var/log/syslog
[...]
Run Code Online (Sandbox Code Playgroud)

我得到这个日志:

Nov 26 08:00:01 stiitsrv9 CRON[26109]: (root) CMD (/usr/local/sbin/backup-sti-epfl-ch)
Nov 26 08:01:02 stiitsrv9 CRON[26108]: (root) MAIL (mailed 13311563 bytes of output but got status 0x004b from MTA#012)
[...]
Run Code Online (Sandbox Code Playgroud)

crontab工作不工作。

此消息是什么意思,我该如何解决?

linux ssh bash cron ubuntu

4
推荐指数
1
解决办法
6562
查看次数

有没有办法在 bash 脚本中获取用户的 SSH 客户端 IP 地址?

由于应用程序限制,我有两个用户需要使用相同的登录名。

这些用户对 shell 提示应该是什么样子有很大的不同意见。其中一位甚至坚持要修改色觉。这导致了 .bashrc PS1 争议。我已经给了他们脚本来设置他们自己的偏好,但是......让我们说这很复杂。

幸运的是,它们都从具有已知 IP 地址的位置连接。有没有一种方法可以将用户的远程 IP 地址合并到一个条件中,从而为他们提供他们想要的东西,而无需任何额外的步骤?他们通过 ssh 连接。

bash bash-scripting

4
推荐指数
1
解决办法
989
查看次数

适用于 Linux 的 Wget 错误 bash Windows 子系统

我在尝试使用 wget 下载时在 WSL 中遇到错误

 wget -O quotefile.txt "https://www.google.com"
Run Code Online (Sandbox Code Playgroud)

输出

Will not apply HSTS. The HSTS database must be a regular and non-world-writable file.
ERROR: could not open HSTS store at '/home/atul/.wget-hsts'. HSTS will be disabled.
--2020-04-08 12:47:43--  https://www.google.com/
Resolving www.google.com (www.google.com)... 2404:6800:4002:80f::2004, 172.217.166.196
Connecting to www.google.com (www.google.com)|2404:6800:4002:80f::2004|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]
Saving to: ‘quotefile.txt’

quotefile.txt                     [ <=>                                              ]  14.68K  --.-KB/s    in 0.002s

2020-04-08 12:47:45 (6.43 MB/s) - ‘quotefile.txt’ saved [15029]
Run Code Online (Sandbox Code Playgroud)

为什么我收到这个错误

Will …
Run Code Online (Sandbox Code Playgroud)

linux bash wget ubuntu windows-subsystem-for-linux

4
推荐指数
2
解决办法
5530
查看次数

当 stdout 和 stderr 都被重定向时,ssh 如何/为什么输出到 tty?

我刚刚注意到

ssh user@host >/tmp/out 2>/tmp/err
Run Code Online (Sandbox Code Playgroud)

可以写类似的东西

Warning the RAS host key...
...
Are you sure you want to continue connecting (yes/no)?
Run Code Online (Sandbox Code Playgroud)

stdout 和 stderr 都被重定向,但这仍然显示在 tty 中。

  1. ssh这是怎么做的?
  2. 为什么ssh要这样做?它不违反 *nix 习语吗?
  3. 当我ssh作为通过管道连接的 stdin/stdout/stderr 的子进程运行(或另一个具有类似行为的程序)时,我希望父进程看到子进程的输出。如果子进程像这样躲避stdout/stderr,父进程怎么捕获呢?

linux ssh bash redirection pipe

4
推荐指数
1
解决办法
984
查看次数

MacOS - “at”命令不起作用

我已经atrun使用以下命令启动了守护进程。

$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist
Run Code Online (Sandbox Code Playgroud)

将我的用户名添加到/var/at/at.allow文件中。

$ cat /var/at/at.allow
myusername
Run Code Online (Sandbox Code Playgroud)

并使用at命令创建了一个作业。

$ at now + 1 minute
touch /tmp/x.log
^D
job 1 at Fri Jan  1 09:56:00 2021
Run Code Online (Sandbox Code Playgroud)

我可以看到使用atq命令安排的作业。

但是我看不到/tmp/x.log在预定时间之后创建的文件。有什么我在这里遗漏的,或者有没有办法调试这个问题?

bash command-line at daemon macos

4
推荐指数
1
解决办法
146
查看次数