标签: bash

使用命令的输出作为退出代码

对于我的持续集成脚本,我想检查 git 分支是否与 master 分支不同步。因此我使用

git rev-list --left-right --count master...my-branch-name
Run Code Online (Sandbox Code Playgroud)

它会返回…… 喜欢

1    3
Run Code Online (Sandbox Code Playgroud)

(3次提交在master之前,1次在后面)

添加| cut -f1只会给我第一个数字(在主人后面提交)。

现在我想用那个数字退出脚本,因为后面的 0 个提交是成功的,所有其他的都应该给出一个错误。

我怎样才能做到这一点?我试过

exit 'git rev-list --left-right --count master...my-branch-name | cut -f1'
Run Code Online (Sandbox Code Playgroud)

但这会引起

/bin/bash: line 66: exit: git rev-list --left-right --count master...my-branch-name | cut -f1:需要数字参数

是否有最佳实践?

bash git exit-code

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

带空格的 Bash 变量(目录)

我试图在/foo保留列出目录中的空格的同时回显所有文件。目前,名为目录"bar1 bar2"将回声出作为/path/to/foo/bar1/然后/bar2file.txt全部上新的生产线。我需要它来 echo/path/to/foo/bar1 bar2/file.txt/path/to/foo/bar1\ bar2/file.txt.

for file in $(find /path/to/foo/ -type f); do
  if [[ ... ]]; then
    echo "${file}"
  fi
done
Run Code Online (Sandbox Code Playgroud)

还试过:

for file in $(find /path/to/foo/ -type f | sed 's/ /\ /g'); do
  if [[ ... ]]; then
    echo "${file}"
    echo "$file" # variations i've tried
    echo $file   # variations i've tried
    echo ${file}
    otherCommand "${file}"
  fi
done
Run Code Online (Sandbox Code Playgroud)

linux bash shell ubuntu bash-scripting

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

在 WSL(Windows 10 的 Bash)上使用 rsync 进行增量备份

我多年来一直是 Linux 的狂热用户,但后来切换到了 Windows。我一直错过的一件事是使用 rsync 制作增量快照以进行备份。你使用这样的命令:

rsync -aP --link-dest=PATHTO/$PREVIOUSBACKUP $SOURCE $CURRENTBACKUP
Run Code Online (Sandbox Code Playgroud)

它将创建您正在备份的文件夹当前状态的完整目录结构,使用硬链接来引用以前的备份。只有新的或更改的文件才会真正写入磁盘;所有其他的都保存为硬链接。这简直太棒了,我在 Windows 中找到的任何解决方案都无法做到这一点。(作为参考,我尝试过 Windows 文件历史记录,并为包括 Crashplan 和其他出色的Beyond Compare在内的商业软件付费。)

既然微软已经引入了 WSL,我已经尝试在 Windows 的 bash 中做到这一点。它似乎运行良好,但 Windows 错误地报告了磁盘上的大小,如下所示:

磁盘大小报告不正确

为了解释一下,snapshot-170831__07h08m48s我在一个快照中添加了一个大型视频文件,1.40 GB,复制需要几秒钟。在下一个快照中,snapshot-170831__07h09m09s文件没有花时间复制,这表明硬链接已正确创建并且我的硬盘驱动器上没有占用空间。

然而,我所有的 Windows 工具(Windows Explorer、Directory Opus、WinDirStat)都报告第二个快照文件夹在磁盘上占用了 1.40 GB。

那么第一个问题是为什么 Windows 会错误地报告这些硬链接的磁盘大小?

但更重要的问题是是否应该这样做:在 Windows 下使用 Linux 工具进行常规文件备份。我已经在 WSL 上看到,使用 Windows 工具修改 .bashrc 等文件会使文件在 WSL 中不可读。我想知道将我的备份委托给这样的工具是否风险太大,或者我是否冒着损坏文件系统和丢失重要文件的风险。

backup bash rsync windows-10 windows-subsystem-for-linux

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

为什么 `ls` 在我的 cmd 上工作?(视窗)

我正在运行 Windows 7,它很旧,而且我弄乱了它。当我在 cmd 中时,我发现它的ls工作原理就像我在 Linux 中所期望的那样。所以执行一些其他命令,例如mvand rm。这本身不是问题,但我想知道它们来自哪里。据我所知,Windows 不自动支持这些。我可能在某个时候自己添加了它们。有什么方法可以尝试设计他们为什么工作?

windows bash command-line

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

将 Windows 10 上的 linux shell (.sh) 脚本与 Bash 或 WSL 相关联

如果您曾尝试通过双击在 Windows 10 上运行 .sh linux 脚本,在默认情况下将其分配给 bash.exe(Windows 10 的 Ubuntu Bash)后,您很可能注意到它不会打开。

为什么它不打开,我该如何解决这个问题?

windows bash sh windows-10 windows-subsystem-for-linux

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

为 tmux 创建“焦点模式”?(一个居中的窗格两侧是两个空白窗格?)

我想使用 tmux 为终端创建一个“焦点模式”,有点像goyo 为 vim 所做的

goyo 截图

问题 1:调整窗格大小

我的想法是通过将窗口分成三个窗格来实现这一点,然后将中心窗格设置为固定的最大值(可能是 80 列?可能是 100?可能根据终端窗口大小不同的最大值,例如响应式 Web 布局?)并设置侧窗格以平均填充剩余的列。我还希望它可以在不同尺寸的屏幕上工作,这样我就可以在我的笔记本电脑和台式机上使用它。

目前,我能想到的唯一方法是与 shell 合作(即,获取终端宽度,tput cols然后使用数学运算计算每个窗格所需的宽度$(()))。我对此没有意见,但是如果在 tmux 中有一种内置方法可以完成此操作,我会因为错过它而感到非常愚蠢。

所以……有吗?

问题 2:消隐侧窗格

这不太重要;看到顶部有提示的大部分空白窗格确实还不错。我知道 tmux 有clock-mode(例如),它会覆盖窗格的内容并显示其他内容。所以我想知道是否有办法完全隐藏非活动窗格的内容。到目前为止,我能想到的最好的方法是将 fg 和 bg 设置为相同的颜色

:select-pane -t:.1 -P 'fg=black,bg=black'
Run Code Online (Sandbox Code Playgroud)

或者,圣杯

如果tmux 中的窗格有边距功能,那么这一切都可以更轻松地完成。据我所知,此功能不存在,但我远非 tmux 专家。有没有可能它在那里而我只是不知道它?

terminal bash tmux

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

获取每个用户的磁盘使用情况

当我输入时,sudo du -sh ~student1我得到了我期望的输出(见截图)。但是,当我尝试使用以下脚本时:

#!/bin/bash

for user in "$@"; do
    sudo du -sh ~$user
done
Run Code Online (Sandbox Code Playgroud)

做同样的事情,我得到一个目录不存在的错误。是一个屏幕截图。

(我知道我可以做到sudo du -sh student1 student2...,而且 bash 脚本没用,但我仍然不明白为什么它不起作用。)

我查看 了特定用户的磁盘使用总量,但这并不是我想要的。

linux bash user

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

为什么我需要在 Windows bash 上使用带有 winpty 的前缀 openssl?

为什么我需要在 Windows bash 上使用带有 winpty 的前缀 openssl?

为什么命令

openssl genrsa -des3 -out ca.key 4096
Run Code Online (Sandbox Code Playgroud)

挂起并且没有响应

尽管

winpty openssl genrsa -des3 -out ca.key 4096
Run Code Online (Sandbox Code Playgroud)

工作正常吗?

windows bash openssl git-bash

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

用于处理 SSH 连接断开/终止的 Linux 陷阱信号

我在 npm 脚本中有一个命令,它通过 SSH 连接到远程构建服务器并运行 Bash 脚本。该脚本设置一个锁文件,并trap在脚本退出时调用以删除该锁文件。

在这两种情况下,我都用ctrl+取消操作C

LOCKFILEPATH="/tmp/env_app.lock"
# cleanup function just deletes $LOCKFILEPATH
function mutex() {
  if [ -f "$LOCKFILEPATH" ]; then
    echo -e "\n\n${redtext}Build already in progress! Exiting.${resettext}\n\n";
    exit 1;
  else
    touch $LOCKFILEPATH;
    trap cleanup EXIT;
  fi
}
Run Code Online (Sandbox Code Playgroud)

当您第一次通过 SSH 进入主机以运行它时,这可以正常工作,但是当您通过 SSH 发送命令时,陷阱不起作用

ssh hostname command
Run Code Online (Sandbox Code Playgroud)

我尝试添加到 trap 命令以运行更多信号,但这些似乎也不起作用:

 trap cleanup EXIT SIGHUP SIGKILL SIGTERM SIGINT
Run Code Online (Sandbox Code Playgroud)

我应该在这里做什么?

我还设置了一个更简单的脚本,当通过 SSH 手动执行它时,它似乎工作正常。也许当我使用 npm 脚本运行它时添加了层?npm 脚本是:

"deploy": "ssh HOSTNAME ''deploy-script $(git rev-parse …
Run Code Online (Sandbox Code Playgroud)

linux ssh bash

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

错误 Nmap:“dnet:无法在 Ubuntu 上打开设备 wifi0”(W10 bash)

我在使用 nmap 时遇到问题。

当我想执行任何命令时,nmap 会回答我:

Nmap: 'dnet: 无法打开设备 wifi0'

我正在使用 W10 bash 子系统开发 Ubuntu。

我在这里发红https://github.com/Microsoft/WSL/issues/1349 W10 bash 不支持某些数据包,您认为这就是答案吗?

谢谢。

networking linux bash nmap windows-10

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