我如何知道是本地 HDD 还是 USB 密钥?我更喜欢一种没有root权限的方法。/dev/sdX
好的,udevadm
帮了大忙:
对于本地硬盘:
udevadm info --query=all --name=sdb | grep ID_BUS
E: ID_BUS=ata
Run Code Online (Sandbox Code Playgroud)
对于 USB 密钥:
udevadm info --query=all --name=sdc | grep ID_BUS
E: ID_BUS=usb
Run Code Online (Sandbox Code Playgroud) 有时我会误解命令的语法:
# mysql -d test
mysql: unknown option '-d'
# echo $?
2
Run Code Online (Sandbox Code Playgroud)
我再试一次,结果正确:
# mysql --database test
Welcome to the MySQL monitor.
mysql >
...
Run Code Online (Sandbox Code Playgroud)
如何防止第一个错误代码不为 0 的命令进入历史记录?
假设我var
在 bash 中有一个变量。我可以给它赋值。例如,我将其设为字符串:
var="Test"
Run Code Online (Sandbox Code Playgroud)
我想要的是echo
的名称var
,而不是var
. (我可以用 做后者echo $var
,但我实际上想做前者。)
SO 对这个问题的回答说要使用echo ${!var}
,但是当我这样做时,我 echo 只返回一个空行。例如,这个 bash 脚本
#!/bin/bash
echo "Hi"
var="Test"
echo ${!var}
echo "Bye"
Run Code Online (Sandbox Code Playgroud)
返回此输出:
Hi
Bye
Run Code Online (Sandbox Code Playgroud)
在Hi和Bye之间只有一个空行,而不是var。我究竟做错了什么?
我在Ubuntu 10.04.4上运行bash 4.1.5(1)。
出于好奇,在进行 bash 变量比较(其值为 an integer
)时,可以针对某些声明为 anint
或 as 的预定义值对其进行测试string
。
示例脚本:
#!/bin/bash
f1()
{
[ "$1" == "1" ] && echo "$FUNCNAME: \"1\" compared as string"
}
f2()
{
[[ "$1" -eq 1 ]] && echo "$FUNCNAME: \"1\" compared as int"
}
f1 $1
f2 $1
Run Code Online (Sandbox Code Playgroud)
输出:
$ ./param.sh 1
f1: "1" compared as string
f2: "1" compared as int
Run Code Online (Sandbox Code Playgroud)
和
$ ./param.sh blah
$
Run Code Online (Sandbox Code Playgroud)
这两个函数的行为方式相同,所以我想知道检查整数变量时是否有首选方法?我会去检查int
vsint
因为它更严格,但我想知道这样做是否有任何缺点string
?
在这种情况下,f2()
对比较也更加严格,即传递一个十进制值会破坏它,而不 …
我在 Bash 中尝试了 'man echo',它告诉我 'echo --help' 将显示帮助然后退出,同样,'echo --version' 将输出版本并退出。但为什么它不起作用?'echo --help' 只是简单地按字面打印 '--help'。
我在 Bash 脚本中经常使用颜色(主要在 CentOS 上),但为了使它们的使用更方便,我最终将变量重新定义为颜色值:
local GRAY="\[\033[1;30m\]"
local LIGHT_GRAY="\[\033[0;37m\]"
local CYAN="\[\033[0;36m\]"
local LIGHT_CYAN="\[\033[1;36m\]"
local NO_COLOUR="\[\033[0m\]"
Run Code Online (Sandbox Code Playgroud)
或者也有tput
:
bold=`tput bold`
normal=`tput sgr0`
whitef=`tput setaf 7`
greenf=`tput setaf 2`
redb=`tput setab 1`
Run Code Online (Sandbox Code Playgroud)
我已经搜索了/etc/rc.d/init.d
目录,但没有找到任何与颜色定义相关的内容。
是否已经有了这样的定义?如果不是,我会将它们放入一个文件中/etc/rc.d/init.d
,并将其包含在我的脚本中,有点像/etc/rc.d/init.d/functions
要么我在这里问的是非常非正统的/非常规的/冒险的,要么我的 Google-fu 技能不符合要求...
在bash
shell 脚本中,是否有任何简单的方法可以判断它是由另一个 shell 脚本获取的,还是由它自己运行的?换句话说,是否可以区分以下两种行为?
# from another shell script
source myScript.sh
# from command prompt, or another shell script
./myScript.sh
Run Code Online (Sandbox Code Playgroud)
我正在考虑做的是创建一个类似于实用程序的 shell 脚本,其中包含bash
可以在获取时可用的函数。但是,当这个脚本自己运行时,我也喜欢它根据定义的函数执行某些操作。这个shell脚本是否有某种环境变量可以选择,例如
some_function() {
# ...
}
if [ -z "$IS_SOURCED" ]; then
some_function;
fi
Run Code Online (Sandbox Code Playgroud)
最好,我正在寻找一种不需要调用者脚本设置任何标志变量的解决方案。
编辑:我知道采购和运行脚本之间的区别,我想在这里找出是否可以分辨正在使用的脚本的区别(两种方式)。
我昨天在我的 CentOS 7 上发出了很多命令。但是今天我想检索这些命令时,我发现没有任何记录。当我打开文件时.bash_history
,我仍然找不到我昨天发出的命令,但我发现了许多前几天的旧命令。为什么没有存储最近的命令?如何提高历史记录能力?
Bash 使用感叹号进行历史扩展,如该问题的答案中所述(例如,使用sudo !!
运行先前的命令行sudo
)。但是,我找不到任何解释运行以下命令(即单个感叹号)的作用的地方:
!
Run Code Online (Sandbox Code Playgroud)
它似乎不打印任何内容并以 1 退出,但我不确定为什么会这样。我已经在网上和 Bash 手册页中查看过,但除了它是一个“保留字”这一事实之外,找不到任何东西——但也是如此}
,并运行这个:
}
Run Code Online (Sandbox Code Playgroud)
打印错误:
bash: syntax error near unexpected token `}'
Run Code Online (Sandbox Code Playgroud) 因为我大部分时间都在 IPython shell 中度过,所以我有一个坏习惯,即在终端命令前加上感叹号。通常,这只会导致错误,但有时,它会导致一些不好的事情发生。我可以有效地禁用!
终端中的功能吗?这是否有干扰任何脚本的风险?
bash ×10
shell ×2
colors ×1
command-line ×1
echo ×1
exit-status ×1
hard-disk ×1
hardware ×1
shell-script ×1
terminal ×1
test ×1