我想在脚本的开头显示一条欢迎消息:
echo "Running $0 $@"
但$@
可能会很长。如何将这条线分成多条最多 80 个字符的行?
我想在脚本的开头显示一条欢迎消息:
echo "Running $0 $@"
但$@
可能会很长。如何将这条线分成多条最多 80 个字符的行?
对不起,没有信息的标题......
我正在寻找的是这样的东西,它可以让我缩短重定向标准输出。我知道在执行带有空格的命令之前不会将其写入历史记录,并且有一些“魔术”运算符,例如“!!”等。
我基本上是在寻找类似的东西,它可以让我替换>/dev/null
,所以,我可以写,例如
git pull !!!
这将相当于git pull>/dev/null
有这样的事情吗?我可以覆盖现有的运算符/编写一个新的运算符吗?
我有一个 read_user_input.sh 脚本:
#!/bin/bash
# set -e
prompt="bla? [Y/n] "
while true; do
read -p "$prompt" -n 1 -s -t 3 reply
case $reply in
""|Y|y) echo "bla!!!"; break;;
N|n) echo "no bla :( you suck"; break;;
*) ;;
esac
done
按我的预期工作 - 即
但是,添加时set -e
- 读取以错误 > 128 结束。
来自read --help
:
Exit Status:
返回码为零,除非遇到文件结尾、读取超时(在这种情况下大于 128)、发生变量分配错误或将无效文件描述符作为参数提供给 -u。
克服这个问题的最佳方法是什么?
|| true
似乎不对,因为它会隐藏任何真正的错误。set -e
.trap
但这似乎有点矫枉过正我有一个带有一些 c++ 代码的 pkg。目前我正在将一些 c++ 代码编译为二进制,一些作为库,我可以在其他平台上发布和部署它。
但是,我那里也有一个驱动程序,由于它对内核的依赖性,我无法交叉编译,这使得每个内核可能需要不同的二进制文件。
所以,我想要的是一个 .deb,我将在其中存储 /usr/bin 下的二进制文件(完成),/usr/lib 下的库(也完成)和 /opt/driver 下的驱动程序源代码(我猜......这是一个合法的地方吗?)
打包这是很容易的部分,因为我需要做的就是将它放在我的工作区中,然后调用dpkg-deb
. 我不确定的是两件事
dpkg / apt
为我做吗?还是我需要运行dpkg -i pkg
然后运行make
?[查看postinst但我不确定这是否是正确的方法]如果它可以解决这个问题,我对任何类型的构建系统持开放态度,尽管我目前正在使用 cmake 并且更愿意坚持使用它
我的 POC:
tree bla_x86_64
bla_x86_64
├── DEBIAN
│ ├── control
│ └── postinst
├── opt
│ └── bla.cpp
└── usr
├── bin
│ └── bla.bin
└── lib
└── bla.lib
cat bla_x86_64/DEBIAN/postinst
#!/bin/sh
set -e
echo hello world!
echo compiling $(ls /opt/bla.cpp)
echo cleanup
rm -rvf /opt/bla.cpp
$ dpkg-deb --build --root-owner-group bla_x86_64/
dpkg-deb: building package 'bla' in 'bla_x86_64.deb'.
$ sudo dpkg -i bla_x86_64.deb
(Reading database ... 407519 files and directories currently installed.)
Preparing to unpack bla_x86_64.deb ...
Unpacking bla (4.0) over (3.0) ...
Setting up bla (4.0) ...
hello world!
compiling /opt/bla.cpp
cleanup
removed '/opt/bla.cpp'
我正在尝试自动将我的耳机与我的 ubuntu16 机器配对。
我拿了这个漂亮的脚本并尝试了它,但它不起作用。我玩了一会儿,发现我可以使用这个最小的脚本:
#!/usr/bin/expect -f
set prompt '#'
set address [lindex $argv 0]
spawn bluetoothctl &> /dev/null
expect -re $prompt
send "\nconnect <my_mac_addr>\r"
sleep 10
我将它保存为 ./bluetooth.sh 并使用 ./bluetooth.sh & 运行它,它就像一个魅力。但是,我得到了这个烦人的bluetoothctl
输出:
[NEW] Controller *** ### [default]
[NEW] Device *** A
[NEW] Device *** B
[NEW] Device *** C
[bluetooth]#
我尝试使用添加到 spawn 命令的重定向将其删除,但正如您所见,它没有帮助...
删除expect
会工作,但我不确定这是要走的路......
如果我有多个主机,我想为其添加别名,例如
10.0.0.10 ip_10
10.0.0.11 ip_11
10.0.0.12 ip_12
有没有办法将这些组合成一行?
我试过了
10.0.0. ip
然后尝试用 ping 它,ping ip.10
但它给了ping: unknown host ip.10
.
我也试过10.0.0.* ip.*
给定一个开发包列表(例如 pkgs="python3.5-dev python3-tk"),运行之间会有区别吗
sudo apt-get install $pkgs
对比
for p in $pkgs; do sudo apt-get install $p; done
我问的主要是依赖项-拓扑排序相关,即是否会以任何一种方式下载和安装不同的包
我想写一个这样的简单循环:
for f in my_file0 my_file1 my_file2; do
(( $(find . -name $f | wc -l > 0 ))
done
但是,我希望循环在失败时中断脚本并打印错误消息,所以我这样做了:
for f in my_file0 my_file1 my_file2; do
(( $(find . -name $f | wc -l > 0 )) || echo error && exit 1
done
显然,它在第一次迭代时退出。
所以,我继续使用这个解决方案
for f in my_file0 my_file1 my_file2; do
(( $(find . -name $f | wc -l > 0 )) || (echo error && exit 1)
done
据我了解,它只退出子外壳:-(
所以,现在我这样写:
for f in my_file0 my_file1 my_file2; do
(( $(find . -name $f | wc -l > 0 ))
if (( $? > 0 )); then echo error && exit 1; fi
done
但这很糟糕……
除了调用将运行这两个命令的函数之外,我还能做什么?
我有一个获取 N 参数的脚本。它首先解析它们(提取一个特定的值X
),然后用该值调用另一个程序:
function main() {
parse "$@"
run "$@"
}
main "$@"
我想在 args 列表的开头添加一个可选参数(用于设置我正在运行的 python 版本的参数)。所以我将它添加到解析函数中:
if [ "$1" = '2' ] || [ "$1" = '3' ]; then version=$1 && shift; else version=2; fi
但是,在解析结束后,我被卡住了,因为shift
它不影响运行功能。如果不再次检查第一个值的值,我怎么能做到这一点(这会破坏拥有解析函数的整个目的)
给定这样的一行:"hello my (name) is (user)
,我怎样才能删除所有'()'
使用sed?
我目前正在做的是使用视觉块突出显示该行,然后:s/(//g
一次又一次地为)
. 有没有办法(, )
在一个sed命令中同时删除两者?
我的最终目标是"hello my name is user"
当我运行grep "keyword" -n
并获得以下结果列表时:
a/b/c:10: keyword
a/b/c:70: keyword
a/b/d:50: keyword
如何在它找到的行中打开其中一个文件(比如列表中的第二个)?
我现在只需使用鼠标复制输出,然后复制它vim
,然后添加+
我复制的行号。(这意味着我vim a/b/c +70
使用鼠标副本来获取文件名,并使用另一个鼠标副本来获取行号[或者我只是手动复制它,当它足够短时])
有没有办法用键盘快捷键做到这一点?
假设我做git stash
了几次,每次都进行更改,我可以看到,使用git stash show
存储堆栈顶部更改的文件是什么。我还可以看到我有多少添加/删除。
但是,我不知道如何在没有git stash pop
和的情况下查看更改本身git diff
另外,我如何查看以前的文件更改(最好查看整个更改,但查看文件也会有帮助)git stash
?
我想列出我拥有的 2 个文件中的所有函数,所以我使用了:
cat <file_A> | grep -E "^function"
cat <file_B> | grep -E "^function"
如何比较输出并突出相似之处?
我有一个由另一个用户填写的目录,我的任务是维护它。我想删除它的所有内容,除了具有特定名称的 2 个文件。是否有可能rm
或应该这样做:
cp aaa/a ./a && cp aaa/b ./b && rm -rf aaa/* && mv ./a aaa/a && mv ./b aaa/b
aaa
目录在哪里,a,b
是我要保留的文件,还有(至少,可能有)其他文件/目录。
有没有更好(更短)的方法?
我有几个标志要添加到我的 gcc 编译中,所以我alias
将它们编辑为
alias gcc_flags='-std=c99 -Wall -pedantic -Wextra -Wconversion'
并尝试像这样编译:
$ gcc gcc_flags file_name.c -o object_name -L/usr/lib/i386-linux-gnu -lcurl
gcc: error: gcc_flags: No such file or directory
编译时没有别名,即
gcc -std=c99 -Wall -Wextra -Wconversion -pedantic file_name.c -o object_name -L/usr/lib/i386-linux-gnu -lcurl
编译工作得很好。这是为什么?
gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
alias gcc_flags='-std=c99 -Wall -pedantic -Wextra -Wconversion'
出现在我的别名列表中Release: 14.04
顺便说一句,是不是到了默认gcc
编译的时候了?-std=c99