假设我想ssh在我的.ssh config文件中使用相同的设置为 30 个服务器配置我的选项:
host XXX
HostName XXX.YYY.com
User my_username
Compression yes
Ciphers arcfour,blowfish-cbc
Protocol 2
ControlMaster auto
ControlPath ~/.ssh/%r@%h:%p
IdentityFile ~/.ssh/YYY/id_rsa
Run Code Online (Sandbox Code Playgroud)
这 30 台机器之间唯一变化的地方是XXX.
除了在我的config文件中重复上述结构 30 次之外,还有另一种方法来定义一系列机器吗?
有没有什么简单的方法可以将命名参数传递(接收)给 shell 脚本?
例如,
my_script -p_out '/some/path' -arg_1 '5'
Run Code Online (Sandbox Code Playgroud)
并在内部my_script.sh将它们接收为:
# I believe this notation does not work, but is there anything close to it?
p_out=$ARGUMENTS['p_out']
arg1=$ARGUMENTS['arg_1']
printf "The Argument p_out is %s" "$p_out"
printf "The Argument arg_1 is %s" "$arg1"
Run Code Online (Sandbox Code Playgroud)
这在 Bash 或 Zsh 中可能吗?
我想我了解交互式、登录和批处理 shell 之间的区别。请参阅以下链接以获取更多帮助:
我的问题是,如果我在交互式、登录或批处理 shell 上,如何使用命令/条件进行测试?
我正在寻找一个命令或条件(返回true或false),我也可以放在 if 语句中。例如:
if [[ condition ]]
echo "This is a login shell"
fi
Run Code Online (Sandbox Code Playgroud) 说我有一个巨大的文本文件(> 2GB),我只是想cat行X至Y(如57890000至57890010)。
据我所知,我可以通过管道head输入tail或反之亦然来做到这一点,即
head -A /path/to/file | tail -B
Run Code Online (Sandbox Code Playgroud)
或者
tail -C /path/to/file | head -D
Run Code Online (Sandbox Code Playgroud)
其中A、B、C和D可以根据文件中的行数计算得出,X和Y。
但是这种方法有两个问题:
A,B,C和D。pipe相互发送比我感兴趣的多得多的行(例如,如果我只读取大文件中间的几行)有没有办法让 shell 只使用并输出我想要的行?(同时仅提供X和Y)?
我很难在 zsh 中定义和运行我自己的 shell 函数。我按照官方文档上的说明进行操作,并首先尝试使用简单的示例,但未能使其正常工作。
我有一个文件夹:
~/.my_zsh_functions
Run Code Online (Sandbox Code Playgroud)
在这个文件夹中,我有一个functions_1具有rwx用户权限的文件。在这个文件中,我定义了以下 shell 函数:
my_function () {
echo "Hello world";
}
Run Code Online (Sandbox Code Playgroud)
我定义FPATH为包含文件夹的路径~/.my_zsh_functions:
export FPATH=~/.my_zsh_functions:$FPATH
Run Code Online (Sandbox Code Playgroud)
我可以.my_zsh_functions用echo $FPATH或确认文件夹在函数路径中echo $fpath
但是,如果我再从 shell 中尝试以下操作:
> autoload my_function
> my_function
Run Code Online (Sandbox Code Playgroud)
我得到:
zsh:my_test_function:未找到函数定义文件
我还需要做些什么才能打电话my_function吗?
到目前为止的答案建议使用 zsh 函数获取文件。这是有道理的,但我有点困惑。zsh 不应该知道这些文件在哪里FPATH吗?那这样做的目的是autoload什么?
我注意到在zsh 中有两种构建循环的替代方法:
for x (1 2 3); do echo $x; donefor x in 1 2 3; do echo $x; done他们都打印:
1
2
3
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么是这两种语法?是否在每个对象中$x迭代不同类型的对象?
bash是否有类似的区别?
为什么以下工作?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
for x in $d; do print $x;done
Run Code Online (Sandbox Code Playgroud)
但这个没有?:
#!/bin/zsh
a=1
b=2
c=5
d=(a b c)
# It complains with "parse error near `$d'"
for x $d; do print $x;done
Run Code Online (Sandbox Code Playgroud) 本站点和 StackOverflow 上的以下几个线程有助于理解IFS工作原理:
但我还有一些简短的问题。我决定在同一篇文章中问他们,因为我认为这可能有助于更好的未来读者:
一季度。 IFS通常在“字段拆分”的上下文中讨论。是场分裂一样的分词?
Q2: POSIX 规范说:
如果IFS 的值为空,则不进行字段拆分。
设置IFS=是否与设置IFS为空相同?这也是将其设置为 an 的意思empty string吗?
Q3:在 POSIX 规范中,我阅读了以下内容:
如果没有设置 IFS,shell 的行为就像 IFS 的值是
<space>, <tab> and <newline>
假设我想恢复IFS. 我怎么做?(更具体地说,我如何引用<tab>和<newline>?)
Q4:最后,这段代码如何:
while IFS= read -r line
do
echo $line
done < /path_to_text_file
Run Code Online (Sandbox Code Playgroud)
如果我们将第一行更改为
while read -r line # Use …Run Code Online (Sandbox Code Playgroud) Zsh 如何跟踪命令历史?
我在主目录中看到两个文件:.zhistory和.zsh_history. 它们之间有什么区别?这些文件似乎包含我的所有历史记录。Zsh 是否会永远向其中之一添加行?这不会使历史搜索太慢吗?
我可以安全地将这些文件符号链接到另一个位置吗?(例如,用于跟踪历史更改的 git 存储库)