假设我有一个 10MB 的文本文件foo.txt,它有 100,000 行。现在,我想foo.txt逐个窗口处理,窗口大小为 10。
我目前的脚本是这样的:
for ((i=0;i<$lines;i=i+$step))
do
head -$((i+step)) $1 | tail -$step > tmp1
head -$((i+step)) $2 | tail -$step > tmp2
setstr=$setstr' '`./accuracy.sh tmp1 tmp2`
done
echo $setstr | awk '{for (i=1;i<=NF;i++) sum+=$i; }END{print sum/NF}'
Run Code Online (Sandbox Code Playgroud)
但它运行缓慢。有什么简单有效的方法可以做到这一点吗?
我的默认外壳是鱼,因为它更好。但通常当我运行脚本时,我收到的错误似乎是由 fish 处理的 bash 脚本引起的。我认为这是因为脚本编写者假设默认的 shell 是 bash,但我不明白其中的机制。
例如,CrashPlan install.sh 脚本以 bash shebang 开头:
~/CrashPlan-install> head install.sh
#!/bin/bash
#############################################################
# Linux Client Installer Script
#############################################################
Run Code Online (Sandbox Code Playgroud)
所以当我运行./install.sh它时,它应该由 bash 处理,对吗?默认终端外壳应该是无关紧要的。然而,当我的默认 shell 是 fish 时,运行这样的脚本会导致 fish 返回错误,就好像它正在处理脚本一样:
fish: Expected a command name, got token of type “Run job in background”. Did you mean
“COMMAND; and COMMAND”? See the help section for the “and” builtin command by typing “help and”.
Standard input: sed -imod "s|Exec=.*|Exec=/usr/local/crashplan/bin/CrashPlanDesktop|"
/home/username/Desktop/CrashPlan.desktop && rm -rf /home/username/Desktop/CrashPlan.desktopmod
Run Code Online (Sandbox Code Playgroud)
这是因为我的计算机配置错误还是因为脚本是以不可移植的方式编写的?
有没有办法在另一个用户的权限下(自动)执行 bash 脚本?我认为“sudo”是正确的方法,但我不知道如何自动化该过程。
例如,我想运行这样的程序(用户“bla”在“blub”下运行一个进程):
sudo <the user under which i want to run the process> <path to script>
Run Code Online (Sandbox Code Playgroud) 如何直接从 shell 将数字列表通过管道传输到命令中?例如这样的事情
[1,2,3,4] | sort
Run Code Online (Sandbox Code Playgroud)
会给
1
2
3
4
Run Code Online (Sandbox Code Playgroud)
编辑:
回应到目前为止友好发布的答案。. . 我问这个,因为我想快速测试和调试一个控制台应用程序,该应用程序在输入时需要输入许多数字,而不必键入许多单独的值,然后回车。我只想输入“one liner”,然后不时点击向上箭头,然后重播命令。理想情况下,我希望在不使用包含值的文本文件的情况下执行此操作(这显然是最简单的方法。)
我在 bash_profile 中设置了以下提示:
export PS1='\[\e[1;94m\h:\W \u\e[1;93m\$\e[0m \]'
# default = '\h:\W \u\$ '
Run Code Online (Sandbox Code Playgroud)
不幸的是,在某些情况下我遇到了问题:
在空白提示下,我输入一个字符,然后按退格键 - 提示被完全删除,光标移到终端的左边缘,而不是简单地删除该字符
如果我使用向上和向下箭头键自动完成跨越多行的命令,则只有当前行更改,但上面的行(在提示之后)保持不变
我如何更正我的提示,使其在所有情况下都像默认提示一样正常运行?
我知道如何使用:!rand在 vim 中运行 shell 命令:!,但是有没有办法从外部(即从 bash)执行此操作?
类似的东西vim 'ls -al'。的输出ls应该在 vim 中并且是可编辑的。
我使用“cd -”在文件夹之间切换。喜欢:
cd /etc/
cd -
Run Code Online (Sandbox Code Playgroud)
但是为什么“cd -”会打印地址(如密码)?我怎样才能阻止它打印地址?
有时,我的 shell (zsh) 启动时间比平时长(我打开终端,在我可以输入命令之前它会挂起一点)。
我有我的几个别名.zshrc(当然,实际上他们是在一个不同的文件.zshrc做了source上)。
如果你做一个alias与外壳打开,则只能通过当前的会话仍然有效,所以我就开始怀疑这一切source与alias实际损害的shell启动的性能(我假设它要经过运行所有的漫长过程启动命令)。
如果确实发生了这种情况,将这些别名作为 shell 脚本并将它们放在我的PATH某处不是更有效吗?
我使用了很多涉及网卡 Mac 地址的脚本。是否有我可以读取的文件或我可以用来获取 Mac 地址的命令?我不想要任何标题或任何东西,只需要 1 行具有 Mac 地址的输出。我想在登录时将其设置为环境变量。我使用 Arch Linux x64
我遇到了以下问题。
我在.bashrc(和.bash_profile)中定义了一个别名:
alias echo2="echo"
Run Code Online (Sandbox Code Playgroud)
这很有效:
$ echo2 "test"
test
Run Code Online (Sandbox Code Playgroud)
但是,如果我尝试在重定向后使用它,则它不起作用:
ls | awk '{print "echo2 "$1}' | bash
bash: line 1: echo2: command not found
bash: line 2: echo2: command not found
...
Run Code Online (Sandbox Code Playgroud)
有人知道为什么吗?我怎样才能让它工作?
bash ×10
shell ×5
alias ×2
linux ×2
macos ×2
pipe ×2
script ×2
arch-linux ×1
bashrc ×1
chsh ×1
file-io ×1
fish ×1
mac-address ×1
networking ×1
privileges ×1
shell-script ×1
sudo ×1
syntax ×1
terminal ×1
vim ×1
zsh ×1