当我尝试pkill -f
通过 ssh 远程运行并尝试丢弃可能的错误代码(即使没有找到进程也继续执行脚本的其余部分)时,|| true
行为与我预期的不一样。
$ pkill asdf || true
$ echo $?
0
$ pkill -f asdf || true
$ echo $?
0
$ ssh pi@10.20.0.10 "pkill asdf || true"
$ echo $?
0
$ ssh pi@10.20.0.10 "pkill -f asdf || true"
255
Run Code Online (Sandbox Code Playgroud)
我想是ssh返回 255,而不是引号之间的命令,但为什么呢?
我知道这[]
在ls
模式匹配中起作用:
$ ls
foo.c foo.h
$ ls foo.[ch]
foo.c foo.h
Run Code Online (Sandbox Code Playgroud)
但我找不到记录在哪里。
我想知道与这些匹配的语法:
$ ls
foo.asd foo.qwe
Run Code Online (Sandbox Code Playgroud)
这是我最好的猜测:ls foo.[{asd}{qwe}]
。这没用。
要将一堆 zip 文件从一个位置复制到另一个位置:
$ cp *.zip destination/
Run Code Online (Sandbox Code Playgroud)
将一堆 zip 文件解压缩到一个目录:
$ unzip \*.zip -d destination/
Run Code Online (Sandbox Code Playgroud)
man unzip
说:
星号前的反斜杠仅在 shell 扩展通配符时才需要,如在 Unix 中
让我感到困惑的是,这两个命令的行为方式似乎不同。他们为什么不呢?有没有办法知道或猜测每个命令的行为方式,而不是每次都记住或阅读手册页?
是否不同,因为它cp
被实现为采用多个源参数而unzip
不是?unzip
可以取带通配符的字符串,为什么不实现取多个源文件呢?
获取源参数的标准方法是什么?是不是cp
真的做得太多了?
这是我的内容~/.xsession
:
#!/bin/bash
# Tray for skype, keyboard layout, ...
trayer --edge top --align right --SetDockType true --SetPartialStrut true --expand true --width 10 --transparent true --tint 0x686868 --height 17 &
# Keyboard layout switcher
setxkbmap -layout us,se -option 'grp:alt_shift_toggle' &
xscreensaver -nosplash &
Run Code Online (Sandbox Code Playgroud)
在 lightdm 中选择 xmonad 登录后,xscreensaver 没有运行,trayer 也没有运行,并且 setxkbmap 没有设置。
我见过这个问题,这是完全一样的,但那里的答案没有帮助:
~/.xsession
对所有人都可执行如果我理解正确,输出的默认分隔符awk
是space。
但是,以下脚本的行为不符合我的预期。我无法将 的输出解析awk
为数组:
#!/bin/bash
echo "------ with input string from awk ------"
ALL_TTY_OWNERS_STR=$(ls -l /dev | grep tty | awk '{print $3}')
read -r -a ALL_TTY_OWNERS_ARRAY <<< "$ALL_TTY_OWNERS_STR"
echo "${#ALL_TTY_OWNERS_ARRAY[@]}" # This says 1
echo "${ALL_TTY_OWNERS_ARRAY[0]}" # "root", as expected
echo "${ALL_TTY_OWNERS_ARRAY[1]}" # empty string, expected "root"
echo "${ALL_TTY_OWNERS_ARRAY[2]}" # empty string, expected "root"
echo "------ with my manually created input string ------"
ALL_TTY_OWNERS_STR="root root root" # only for testing
read -r -a ALL_TTY_OWNERS_ARRAY …
Run Code Online (Sandbox Code Playgroud) 我已经安装了 emacs apt-get
。稍后我尝试将其删除,但保留了二进制文件。
root@ionian:/home/gauthier# apt-get --purge remove emacs
Reading package lists... Done
Building dependency tree
Reading state information... Done
Package 'emacs' is not installed, so not removed
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
root@ionian:/home/gauthier# which emacs
/usr/bin/emacs
root@ionian:/home/gauthier#
Run Code Online (Sandbox Code Playgroud)
(上面显示的清除不是第一次尝试,这只是为了表明该软件包已被删除。)
在我安装之前没有安装 emacs apt-get install emacs
。
知道发生了什么吗?为什么 apt-get 看不到二进制文件,为什么它认为 emacs 已经卸载了?完全卸载 emacs 的干净方法是什么?
我知道nohup
。它可以防止进程在挂断后死亡。
我想要的是我的用户 crontabs 运行,即使我的会话在它们应该运行时超时。我相信我需要用户仍然登录才能发生这种情况。
无论用户是否登录,我如何确保用户的 crontab 都在运行?
我需要让用户实际登录吗?
我应该改用系统 crontab 吗?
还有其他解决方案吗?