我需要创建一个 shell 脚本来检查文件是否存在,如果文件不存在,则创建它并继续执行下一个命令,或者只是继续执行下一个命令。我所拥有的不会那样做。
#!/bin/bash
# Check for the file that gets created when the script successfully finishes.
if [! -f /Scripts/file.txt]
then
: # Do nothing. Go to the next step?
else
mkdir /Scripts # file.txt will come at the end of the script
fi
# Next command (macOS preference setting)
defaults write ...
Run Code Online (Sandbox Code Playgroud)
回报是
line 5: [!: command not found
mkdir: /Scripts: File exists
Run Code Online (Sandbox Code Playgroud)
不知道该怎么办。谷歌搜索给我带来的每个地方都表明了一些不同的东西。
我想将标准输出从一个进程发送到另一个进程的标准输入,但也发送到控制台。例如,将 stdout 发送到 stdout+stderr。
例如,我的git edit
别名如下:
git status --short | cut -b4- | xargs gvim --remote
Run Code Online (Sandbox Code Playgroud)
我希望将文件名列表发送到屏幕以及xargs
.
那么,是否有类似tee
的实用程序可以做到这一点?这样我就可以执行以下操作:
git status --short | \
cut -b4- | almost-but-not-quite-entirely-unlike-tee | \
xargs gvim --remote
Run Code Online (Sandbox Code Playgroud) 我有以下脚本:
#!/bin/bash
echo "We are $$"
trap "echo HUP" SIGHUP
cat # wait indefinitely
Run Code Online (Sandbox Code Playgroud)
当我发送SIGHUP
(使用kill -HUP pid
)时,没有任何反应。
如果我稍微更改脚本:
#!/bin/bash
echo "We are $$"
trap "kill -- -$BASHPID" EXIT # add this
trap "echo HUP" SIGHUP
cat # wait indefinitely
Run Code Online (Sandbox Code Playgroud)
...然后脚本在echo HUP
退出时做正确的事情(当我按 Ctrl+C 时):
roger@roger-pc:~ $ ./hupper.sh
We are 6233
^CHUP
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?我应该如何SIGHUP
向此脚本发送信号(不一定必须是)?
我知道我可以从变量的前面删除子字符串:
X=foobarbaz
echo ${X#foo} # barbaz
Run Code Online (Sandbox Code Playgroud)
...从变量的后面:
echo ${X%baz} # foobar
Run Code Online (Sandbox Code Playgroud)
我如何将两者结合起来?我试过了:
echo ${{X#foo}%baz} # "bad substitution"
echo ${${X#foo}%baz} # "bad substitution"
echo ${X#foo%baz} # foobarbaz
Run Code Online (Sandbox Code Playgroud)
我不认为我可以使用中间变量,因为它在find -exec
, 中使用,如下所示:
find ./Source -name '*.src' \
-exec bash -c 'myconvert -i "{}" -o "./Dest/${0#./Source/%.src}.dst"' {} \;
Run Code Online (Sandbox Code Playgroud) 星期一早上,我登录到一个框ssh
并运行以下命令:
tail -f /var/log/foo/bar.log | grep something_interesting &
Run Code Online (Sandbox Code Playgroud)
在当天晚些时候的某个时候,我按 Ctrl+D 注销。
星期五,我登录到同一个盒子,发现tail
进程仍在运行。当我退出时,我期待他们退出。
经进一步深挖,似乎shopt huponexit
被设置为off
在那个盒子,并且在一切其他的Linux机器我试过,并在一台Mac OS X盒我试过。
这什么时候开始默认为off
,而不是on
?
我正在尝试增加/dev/sda5
'lvm2 pv' 分区,但它包含在 中/dev/sda2
,这是一个扩展分区。
紧随其后的是大量“未分配”空间/dev/sda2
,因为我刚刚将之前的磁盘克隆到了更大的磁盘。
我的计划是调整扩展分区的大小,然后调整包含的 PV 的大小以匹配。然后我将扩展 VG 和文件系统。
所以我使用 Linux Mint 17.1 USB 记忆棒启动并运行 gparted。它不会让我调整扩展分区的大小,声称它是“忙碌(至少安装了一个逻辑分区)”。
但是,运行mount
(或cat /proc/mounts
)除了安装的 Live USB 图像外不显示任何内容。
有什么问题?
根据man grep
:
-h, --no-filename
Suppress the prefixing of file names on output. This is the
default when there is only one file (or only standard input) to
search.
Run Code Online (Sandbox Code Playgroud)
如果我使用zgrep -h dhclient /var/log/syslog.*
,我仍然会看到文件名。如果我使用zgrep --no-filename ...
,一切都很好。
这是怎么回事?
我正在使用 Ubuntu 12.04.5 LTS。
例如,在 Linux 上,如果您在源中初始化数据(而不是在运行时读取文件),则数据将存储在 .data 段中。该段的大小可以通过内核选项来限制。您可以使用 ulimit -d 找到当前限制。
在我的 Linux 和 macOS 机器上,我得到:
$ ulimit -d
unlimited
Run Code Online (Sandbox Code Playgroud)
为什么我想要配置 .data 段的大小限制?
我有一个精简的 Linux 容器。我想找出它的IP地址。我没有ifconfig
或没有ip
安装(我不想安装它们,因为当我下次重建容器时它们会被删除)。
我可以从 中的某个地方获取 IP 地址/proc
吗?
我有一个日志文件,我按如下方式处理:
grep pattern /var/log/whatever.log | \
cut ... | sort | uniq -c | sort -rn | \
etc....
Run Code Online (Sandbox Code Playgroud)
然而,日志文件相当大,并且从一天开始记录事件。它也不断地附加到。我只想处理最后的 文件的下一个 10 分钟。
所以我正在寻找如下内容:
killafter 600 tail -f /var/log/whatever.log | stuff
Run Code Online (Sandbox Code Playgroud)
或者,更好(等待捕获 1000 条匹配行需要多长时间):
tail -f /var/log/whatever.log | grep pattern | stopafter -lines 1000 | stuff
Run Code Online (Sandbox Code Playgroud)
有什么工具可以让我这样做吗?
相关为什么 Linux Mint 上的 root 密码是我的用户密码?
我的 Mint 17.3 盒子似乎设置了 root 密码:我看到密码哈希/etc/shadow
(以 开头$6$...
)。我想将此密码哈希与我的(已知)用户密码进行比较。
无论出于何种原因,我不相信su -
(在链接的问题中)不使用我的密码,而不是根密码。
有没有一种简单的方法(例如在 bash 中)将已知的哈希值与已知的密码进行比较并查看它们是否匹配?