小编Rob*_*ino的帖子

杀死所有后台作业

是否有比以下更紧凑的杀死后台作业的形式:

for i in {1..5}; do kill %$i; done
Run Code Online (Sandbox Code Playgroud)

此外,{1..5} 显然有一个硬编码的幻数,我怎样才能使它成为“N”,而 N 是正确的数字,而不做:

$(jobs | wc -l)
Run Code Online (Sandbox Code Playgroud)

我实际上在 PS1 中使用 \j 来获取托管作业的数量,这是否等效?

bash

89
推荐指数
4
解决办法
11万
查看次数

scp 和 compress 同时进行,无需中间保存

什么是规范的方式:

  • scp 一个文件到远程位置
  • 压缩传输中的文件(tar或不压缩,单个文件或整个文件夹,7za或者其他更有效的东西)
  • 在不保存中间文件的情况下执行上述操作

我熟悉这样的壳管:

tar cf - MyBackups | 7za a -si -mx=9 -ms=on MyBackups.tar.7z
Run Code Online (Sandbox Code Playgroud)

本质上:

  • 将整个文件夹滚动到一个 tar
  • 将数据传递stdoutstdin压缩程序
  • 应用积极压缩

通过ssh链接执行此操作的最佳方法是什么,文件登陆远程文件系统?


我宁愿不sshfs安装。


这行不通:

scp <(tar cvf - MyBackups | 7za a -si -mx=9 -so) localhost:/tmp/tmp.tar.7z
Run Code Online (Sandbox Code Playgroud)

因为:

/dev/fd/63: not a regular file
Run Code Online (Sandbox Code Playgroud)

ssh scp tar 7z

74
推荐指数
3
解决办法
15万
查看次数

mutt 响应式刷新收件箱的方式

mutt与 Gmail 一起使用时,我有时通过$绑定(同步邮箱)“检查电子邮件更新” ,有时仅通过使用c(更改文件夹)并仅提供=(默认为 MAILBOX)作为要更改的 IMAP 文件夹路径。

有没有更好(特别是:更快)的方法来做同样的事情?例如,一个解决方案将比“假装切换文件夹”更直接,就像我所做的那样。还有一些不会“错过”某些更新的东西,就像$有时似乎做的那样(也许$根本不是为了检查电子邮件,而只是为了清除标记为已删除的邮件等?)

mutt

35
推荐指数
2
解决办法
3万
查看次数

Diff,仅显示来自右侧文件的修改行

我有文件ab并且我想输出b更改后的行,因为它是从a. 只是修改后的行,没有周围的上下文,没有差异偏移标记。

我如何使用 shell 脚本来做到这一点?(没有 Python/Perl/PHP/...)

sed 和 awk 是可接受的解决方案。

现在,我正在做的是 diff -y 与 --suppress-common-lines 和 sed 使用正则表达式反向引用来获取空格后的正确部分。一定会有更好的办法?

使用 perl(这是被禁止的),我会做这样的事情:

diff -y --suppress-common-lines -W $COLUMNS Eclipse_Preferences_Export_*.epf | perl -pe 's/.*\t|\t(.*)$/\1/g'
Run Code Online (Sandbox Code Playgroud)

diff sed awk shell-script

32
推荐指数
2
解决办法
3万
查看次数

CalDAV 命令行客户端?

我想从 CLI 执行我的 CalDAV,就像我从 执行 IMAPmutt一样,就客户而言,我最好的选择是什么?

command-line software-rec

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

passwd 和 passwd- 文件的区别

可能的重复:
谁创建了 /etc/{group,gshadow,passwd,shadow}-?

我有一个奇怪的passwd-文件/etc,注意尾随的破折号:

root@ubuntu:~# ls /etc/passw*
/etc/passwd  /etc/passwd-
Run Code Online (Sandbox Code Playgroud)

注意不同的权限:

root@ubuntu:~# ls -hl /etc/passw*
-rw-r--r-- 1 root root 2.0K Oct 26 13:38 /etc/passwd
-rw------- 1 root root 1.9K Oct 26 13:38 /etc/passwd-
Run Code Online (Sandbox Code Playgroud)

以及内容的区别:

root@ubuntu:~# diff /etc/passwd{,-}
39c39
< mysql:x:119:129:MySQL Server,,,:/nonexistent:/bin/false
---
> mysql:x:119:129::/nonexistent:/bin/false
Run Code Online (Sandbox Code Playgroud)

这里发生了什么事?

root@ubuntu:~# uname -a
Linux ubuntu 3.2.0-29-generic-pae #46-Ubuntu SMP Fri Jul 27 17:25:43 UTC 2012 i686 i686 i386 GNU/Linux
root@ubuntu:~# cat /etc/issue
Ubuntu 12.04.1 LTS \n \l
Run Code Online (Sandbox Code Playgroud)

users password

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

从 CLI 读取人类可读的系统内存?

在 OS X 上,我得到了一个很好的人类可读系统内存,如下所示:

printf -v system_memory \
          "$(system_profiler SPHardwareDataType \
             | awk -F ': ' '/^ +Memory: /{print $2}')"
echo "$system_memory"
Run Code Online (Sandbox Code Playgroud)

打印出友好的:

4 GB
Run Code Online (Sandbox Code Playgroud)

尽管这在 Linux 上是正确的:

lshw -class memory
Run Code Online (Sandbox Code Playgroud)

它输出:

size: 4096MiB
Run Code Online (Sandbox Code Playgroud)

我需要痛苦地解析它并尝试将它变成一个和上面一样好的字符串。

我使用了错误的命令吗?

memory system-information

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

带有时间戳的 Bash 历史记录

我想在我的 Bash $HISTFILE 中记录的命令上保留时间戳,这可能吗?

我没有设法将其设置man bash为信息源。

我的其他选择如下:

function thebanana() {
  local -r -a bash_commands=(
    "ls"
    # ... more coconut commands
  )
  for bash_command in "${bash_commands[@]}"; do
    printf "${bash_command}"
    printf ":"
  done
}
export HISTFILE=banana
export HISTIGNORE="$(thebanana)"
export HISTSIZE=999999
export HISTFILESIZE=999999999
export HISTCONTROL=ignoredups:erasedups
Run Code Online (Sandbox Code Playgroud)

我应该提到我在 OS X Mountain Lion 上(叹气)。uname -a给我:

Darwin CoconutMac.local 12.2.0 Darwin Kernel Version 12.2.0: Sat Aug 25 00:48:52 PDT 2012; root:xnu-2050.18.24~1/RELEASE_X86_64 x86_64
Run Code Online (Sandbox Code Playgroud)

echo $BASH_VERSION给我:

3.2.48(1)-release
Run Code Online (Sandbox Code Playgroud)

尝试添加这个:

export HISTTIMEFORMAT='%b %d %I:%M:%S %p ' …
Run Code Online (Sandbox Code Playgroud)

osx bash command-history

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

从已经运行的脚本中重定向 stderr

我已经运行脚本好几天了。我将 stdout 重定向到$HOME/mylog,但没有重定向 stderr,因为我认为上面没有任何内容。突然间,stderr 上开始出现数千行,所以我暂停了这项工作。有没有一种方法可以$HOME/myerr从现在开始将 stderr 重定向到,而无需重新启动脚本?

我在盒子上有 sudo 访问权限,它是 OS X。

也许使用dtools诱捕的东西?

我不能丢失脚本到目前为止所做的工作并从头开始重新启动它。有没有办法在磁盘上“转储内存中的对象”,冻结程序,编辑变量(例如文件描述符)并使用新的上下文恢复

bash io-redirection stdout

14
推荐指数
2
解决办法
1466
查看次数

ls _not_ 符号链接的所有内容

ls没有办法显示否定条件,例如“所有不是符号链接的文件”?我在项目目录中经常使用后者,但其他否定也很有用。

目前,我的研究仅导致为“like”创建一个别名:

find . -maxdepth 1 ! -type l | sort # (...)
Run Code Online (Sandbox Code Playgroud)

但显然这种方式我没有得到 的着色ls,列格式等......

我有时使用 OS X 10.8.2 上的 Bash v3 和穿山甲上的 Bash v4。

ls bash symlink

13
推荐指数
1
解决办法
5435
查看次数