只是寻找之间的区别
2>&-2>/dev/null|&&>/dev/null>/dev/null 2>&1以及它们与非的Bourne shell喜欢便携性tcsh,mksh等等。
在我的测试中(在 Bash 和 Z Shell 中),我发现定义函数或别名或名称中带有连字符的可执行 shell 脚本没有任何问题,但我不确定这在所有 shell 和所有用例中都没有问题.
我想这样做的原因是连字符比下划线更容易输入,因此更快更流畅。
我不愿相信这不是问题的一个原因是,在某些语言(例如 Ruby)中,即使没有空格,连字符也会被解释为减号。如果在某些 shell 中可能发生这样的事情,我不会感到惊讶,即使没有空格,连字符也被解释为表示选项。
我有点怀疑的另一个原因是我的文本编辑器搞砸了带有连字符的函数的语法突出显示。(当然,这完全有可能只是 shell 脚本的语法高亮配置中的一个错误。)
有什么理由避免使用连字符吗?
每个 shell 都有一个环境变量 $HOME 集(例如:)/Users/lotolo。如果我在 csh 下,我可以unsetenv HOME,如果我这样做,cd我会在家里。我也在 bash ( unset HOME)上对此进行了测试,它的行为是相同的。那么 shell 如何知道 my/other_user 的家在哪里呢?它在哪里读取这些值?
这不是重复的,因为我的问题不是我如何知道,而是shell如何知道HOME. 这种行为也扩展到其他用户。
是否可以重新定义主目录?例如,/ext1/username代替/home/username,即扩展~到另一个目录(而不是更改用户主文件所在的实际主目录)。
(这个问题主要是学术性的,因为这样做似乎是不好的做法。csh尽管阅读了前 10 名,我在使用 的问题上也别无选择。)
我运行以下命令:
pkg_add emacs-23.4,2.tbz 2> output.log
Run Code Online (Sandbox Code Playgroud)
输出仍然显示在终端中。当我按下时?,我得到
pkg_add emacs-23.4,2.tbz 2 > output.log
Run Code Online (Sandbox Code Playgroud)
前有一个空格2。
我原来没有放这个。我试试
pkg_add emacs-23.4,2.tbz > output.log 2>&1
Run Code Online (Sandbox Code Playgroud)
同样,当我按下 时?,空格已添加。
为什么这会发生在我身上?
我在 FreeBSD 上运行 csh。
我本质上想在机器 A 上运行一个脚本,该脚本将通过 SSH 连接到机器 B,在 B 上执行命令,并将输出返回到机器 A。
所以我正在创建一个 csh 脚本来做到这一点,如果可能的话。
例如,此答案中的此解决方案适用于命令行:
ssh user@host << 'ENDSSH'
ls -l
ENDSSH
Run Code Online (Sandbox Code Playgroud)
我可以验证它是在远程而不是本地运行 ls。
但是,我希望能够在本地运行的 csh 脚本中的反引号内执行此操作。那可能吗?
我知道可以通过 SSH 连接并运行远程脚本,但这不是我的情况。
我还听说可以通过 SSH 发送本地存储的第二个脚本(我也没有弄清楚),但我喜欢将所有命令都包含在原始脚本中的想法,因此是 HEREDOC。
我知道这是一个非常特别的问题,但如果有办法,知道如何做会很酷。
行不通的事情
1)
`ssh user@host<<'ENDSSH'`
`echo "ls -l"`
`echo "ENDSSH"`
Run Code Online (Sandbox Code Playgroud)
这给出了错误:
stty: standard input: Invalid argument.
stty: standard input: Invalid argument.
Warning: Command not found
然后它在ls -l本地运行,然后它尝试在ENDSSH本地运行,当然由于找不到命令而失败。
2)
`ssh user@host<<'ENDSSH'`
echo "ls -l"
echo "ENDSSH"
Run Code Online (Sandbox Code Playgroud)
与上面相同的问题,除了它只显示ls -l和ENDSSH作为文本。有道理……因为 HEREDOC …
我想源(即不调用)从任何shell脚本(bash的/ CSH是首要目标,但鱼的zsh,ksh和RC也将是有趣的)。
我想脚本是否可以是单个文件 - 即不是每个 shell 方言的文件。
我可以这样做吗?
我在想类似的事情:
if shell is bash then
# bash code here
else
if shell is csh then
# csh code here
else
if shell is xxxsh then
# xxxsh code here
fi
endif
fi
Run Code Online (Sandbox Code Playgroud)
所以我可以这样做:
csh% source my_script
bash$ . my_script
Run Code Online (Sandbox Code Playgroud)
问题是——当然,这if在每种方言中都不一样,所以我不知何故需要使用对每个 shell 都有效的语法。
编辑
检测外壳是第一步,在运行时确定脚本中的外壳做得很好。
同样重要的一步是如何引用 shell 不同部分的代码,以免混淆其他 shell。想一想:如何在 bash 部分中<<here_document包含在 bash 中合法但在任何其他 shell 中非法的所有组合中的所有字符,而不会混淆其他 shell。任何答案/链接答案都没有涵盖这一点。
如何在shell中将值从科学记数法转换为十进制?(首选C shell)
另外我想将它从 e-12 转换为 e-9 然后 shell
42.53e-12 到 0.04253。我必须这样做才能列出清单。
我的实验室使用 csh 脚本来运行作业。我通常很难调试 shell 脚本,所以我想知道是否有我可以使用的 csh 调试器。
我知道有一些像-x或-v这样的标志可以提供帮助,但是因为脚本有点长,如果我可以在上面设置断点会更好。当我在网上搜索时,我发现有一个专门用于支持断点的 bash 脚本的调试器,但我找不到用于 csh 脚本的调试器。bash 调试器会工作吗?我可以使用特定于 csh 的调试器吗?
csh ×10
bash ×4
shell ×4
home ×2
tcsh ×2
zsh ×2
awk ×1
bashrc ×1
cd-command ×1
command-line ×1
debugging ×1
freebsd ×1
ksh ×1
portability ×1
sed ×1
shell-script ×1
solaris ×1
ssh ×1