小编Rap*_*ael的帖子

将来更改时,如何强化 bash 脚本以防止造成伤害?

所以,我删除了我的主文件夹(或者,更准确地说,我有写权限的所有文件)。发生的事情是我有

build="build"
...
rm -rf "${build}/"*
...
<do other things with $build>
Run Code Online (Sandbox Code Playgroud)

在 bash 脚本中,在不再需要之后$build,删除声明及其所有用法——但是rm. Bash 愉快地扩展到rm -rf /*. 是的。

我觉得自己很傻,安装了备份,重新做我丢失的工作。试图摆脱耻辱。

现在,我想知道:编写 bash 脚本的技巧是什么,以便此类错误不会发生,或者至少不太可能发生?例如,我是否写过

FileUtils.rm_rf("#{build}/*")
Run Code Online (Sandbox Code Playgroud)

在 Ruby 脚本中,解释器会抱怨build没有被声明,所以语言保护了我。

我在 bash 中考虑过的,除了 corraling rm(正如相关问题中提到的许多答案一样,这并非没有问题):

  1. rm -rf "./${build}/"*
    那会扼杀我目前的工作(Git repo),但没有别的。
  2. rm在当前目录之外操作时,它的变体/参数化需要交互。(找不到。)类似的效果。

是这样,还是有其他方法可以编写在这个意义上“健壮”的 bash 脚本?

bash shell-script rm

47
推荐指数
2
解决办法
4401
查看次数

lshw 和 lscpu 在缓存上存在分歧——哪个是对的?

我试图找出有关缓存的细节(特别是哪些缓存在内核之间共享,哪些不是)并且发现了不一致。

sudo lshw 说

*-cache:0
     description: L1 cache
     physical id: a
     slot: Internal Cache
     size: 64KiB
     capacity: 64KiB
     capabilities: synchronous internal write-back
*-cache:1
     description: L2 cache
     physical id: b
     slot: External Cache
     size: 8MiB
     capabilities: synchronous internal write-back
Run Code Online (Sandbox Code Playgroud)

但lscpu声称

L1d cache:   32K
L1i cache:   32K
L2 cache:   256K
L3 cache:  8192K
Run Code Online (Sandbox Code Playgroud)

我不太担心指令和数据缓存加在一起,但是L2去哪儿了?

在运行 Ubuntu 10.10 的机器上观察,或者uname -a说:

Linux name 2.6.35-32-generic #66-Ubuntu SMP Mon Feb 13 21:04:32 UTC 2012 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

这是一个普遍的问题,但请注意,我能找到的最精确的制造商规范和维基百科都没有必要的细节。

无关的奖励问题:是否 …

cpu cache system-information

14
推荐指数
1
解决办法
2760
查看次数

将 PDF 拆分为每页多页的文档

网络上有多种资源解释了如何将 PDF 拆分为多个文件,每个文件在一页上。

但是你怎么能把它们分成几块,比如每块五页?我已经研究了标准工具,例如pdftk但找不到做我想做的选择。

scripting pdf split

7
推荐指数
2
解决办法
8876
查看次数

何时是使用 upstart 启动 Redshift 的合适时间?

我一直在尝试让Redshift在登录前启动,以便明亮的欢迎屏幕不会让我蒙蔽,尤其是在切换用户时。

似乎没有完全支持将 Redshift 作为服务运行(参见例如这个 bug),但原则上似乎是可能的。

在尝试了在 AskUbuntu 上发现的一些东西但没有成功之后,我目前的尝试是建立自己的暴发户任务;这是我的/etc/init/redshift.conf:

# Redshift

description "Redshift"
author      "dude@somewhere.com"

start on (started lightdm)

script
  exec redshift -c /etc/redshift.conf
end script

stop on runlevel [016]
Run Code Online (Sandbox Code Playgroud)

我认为在 LightDM 运行后开始应该会奏效,然后停止。

现在,这最终出现在我的日志文件中/var/log/upstart/redshift.log:

`RANDR Query Version' returned error -1
Initialization of randr failed.
Run Code Online (Sandbox Code Playgroud)

谷歌搜索错误信息不是很丰富。我想我还为时过早,一些服务或其他与显示魔法相关的服务尚未运行。

我的start on表情应该是什么?

Ubuntu 14.04 LTS;3.13.0-77-generic #121-Ubuntu SMP ... x86_64 GNU/Linux;
红移 1.8;RandR 服务器版本 1.4;新贵 1.12.1

startup x11 upstart services lightdm

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

通用预处理器添加额外的空格

继本文之后,我使用GPP为 Markdown 解析器pandoc提供了一些宏。不幸的是,gpp似乎将所有空格复制到结果中。

例如,考虑文件 test.md

% Title
% Raphael
% 2012

\lorem \ipsum
Run Code Online (Sandbox Code Playgroud)

和 test.gpp

\define{lorem}{Lorem}
\define{ipsum}{ipsum...}
Run Code Online (Sandbox Code Playgroud)

现在,调用gpp -T --include test.gpp test.md收益

<empty line>
% Title
% Raphael
% 2012

Lorem ipsum...
Run Code Online (Sandbox Code Playgroud)

这打破了pandoc. 额外的换行符确实是定义之间的换行符;如果我使用

\define{lorem}{Lorem}@@@
\define{ipsum}{ipsum...}
Run Code Online (Sandbox Code Playgroud)

使用额外选项+c "@@@" "\n",空行消失了。但是这种变通方法不仅丑陋,而且还有两个致命的缺陷。

首先,它也将其视为@@@源文件中的注释指示符。正如@@@Markdown 中没有禁止的那样,当@@@(或任何其他选择的分隔符)发生在源文件中时,这可能会产生意想不到的后果。

其次,由于适当的缩进,它不会覆盖行开头的空格。例如,

\define{lorem}{@@@
  \if{a == a}@@@
    ![some image](test.png)@@@
  \endif@@@
}@@@
Run Code Online (Sandbox Code Playgroud)

将导致所有此类图像标签缩进四个空格,从而pandoc将其排版为代码(如指定)。

因此,如果没有gpp在一行中编写文件或引入丑陋的行尾注释而不是缩进,您可以做些什么来防止gpp在整个地方涂抹多余的空格?

compiling whitespace markdown

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

在bash脚本中用空格迭代多个参数

我有一个用于我的 RaspberryPi(运行 Raspbian)的 bash 脚本,它应该将多个文件名作为参数并一个接一个地播放(使用omxplayer)。基本结构是这样的:

#!/bin/bash
for f in ${*}
do
  echo "${f}";
done;
Run Code Online (Sandbox Code Playgroud)

现在当输入文件名包含空格时我遇到了问题;特别是,行为似乎不一致。假设我们有两个文件test a b并且test d e在同一个目录中。使用不同的参数运行上面的脚本会产生以下结果:

$ ./test test\ a\ b
test
a
b
$ ./test "test a b"
test
a
b
$ ./test test\ a*
test
a
b
$ ./test "test a*"
test
a*
Run Code Online (Sandbox Code Playgroud)

但是,奇怪的是:

./test "test*"
test a b
test d e
Run Code Online (Sandbox Code Playgroud)

显然,只有最后一个变体才能提供预期的输出。但是,使用起来很麻烦,特别是如果您想观看单个文件(制表符完成将填充整个名称)或者文件路径中的文件夹名称之一包含空格时。

我可以在 shellscript 中做些什么不同的事情,以便它始终按预期运行?特别是,两者

$./test test*
$./test test\ a\ b test\ d\ e
Run Code Online (Sandbox Code Playgroud)

应该产生相同的输出

test a b …
Run Code Online (Sandbox Code Playgroud)

scripting bash shell-script

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

使用 avconv 映射元数据不起作用

我理解的方式man avconv(版本9.16-6:9.16-0ubuntu0.14.04.1),以下命令应转换input.ogg为output.mp3并结转元数据:

avconv -i input.ogg -map_metadata 0 output.mp3
Run Code Online (Sandbox Code Playgroud)

然而,它没有;ogginfo清楚地显示信息(艺术家、专辑、标题等)input.ogg并id3info确认其output.mp3具有空 (ID3) 标签。

转换ogg为flac或(大概)格式的任何组合时也会发生同样的情况。

我的理解有-map_metadata误吗?有没有办法在格式之间转换并保留标签(没有像这样的硬编码)?

options audio tagging conversion avconv

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

为什么 xdg-open 使用 Mendeley 作为 PDF 的默认值?

与这个问题类似,我有一些应用程序(Calibre、texdoc)使用 Mendeley 打开 PDF。从 Thunar、Thunderbird、Firefox 等打开 PDF 会打开 evince,这是预期的默认设置。

这些应用程序似乎使用了xdg-open:

$ xdg-mime query default application/pdf
mendeleydesktop.desktop
Run Code Online (Sandbox Code Playgroud)

我试图找到它的来源,但没有成功;我用它修复了

xdg-mime default evince.desktop application/pdf
Run Code Online (Sandbox Code Playgroud)

问题仍然是:xdg-openMendeley 应该成为默认 PDF 查看器的想法是从哪里来的?

我使用的是 Ubuntu 16.04 和 i3 4.11。xdg-open版本为 1.1.0 rc3。

defaults configuration mime-types xdg-open xdg

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