我尝试在线搜索答案,但答案(如果存在)被 shell 脚本中的其他 dot 应用程序所掩盖。所以就到这里了。
编辑:原来它与 Fedora 的默认配置有关command_not_found_handle,所以它与 bash 源代码无关。/编辑
我发现虽然 bash 通常会抱怨缺少命令,甚至我在命令行中输入的任何内容都是一个目录:
[root@localhost tmp] # mkdir test
[root@localhost tmp] # test
[root@localhost tmp] # nonexistent
bash: nonexistent: command not found...
[root@localhost tmp] # test
[root@localhost tmp] # cd test
[root@localhost test] # empty
bash: empty: command not found...
[root@localhost test] # .
bash: .: filename argument required
.: usage: . filename [arguments]
[root@localhost test] # ..
Run Code Online (Sandbox Code Playgroud)
以上内容显然是有效且符合预期的。但这些:
[root@localhost test] # ....
[root@localhost test] # ......................... …Run Code Online (Sandbox Code Playgroud) 我已经编写了一些脚本并将它们存储在我的~/bin文件夹中。我已经能够通过在 shell 会话期间调用它们的标题来运行它们。但是,它们不是交互式运行的(我的意思是,我的~/.bashrc别名没有加载)。
有没有办法将它们标记为默认以交互方式运行?或者我必须source ~/.bashrc在它们内部使用定义的任何别名?
欢迎其他替代品!
据我了解,守护进程是后台进程,但守护进程需要唯一的配置文件来设置环境变量。
例如,Hadoop守护进程需要hadoop-env.sh来设置环境变量JAVA_HOME,你不能简单地从中获取变量~/.bashrc。
原因是因为守护进程作为后台进程意味着它是非交互式的,而 ~/.bashrc 意味着仅在交互式会话中使用,以防止出现alias cp='cp -i'case。
最新的~/.bashrc文件顶部有安全防护不允许非交互式调用者,即没有-i选项将提前返回:
# ~/.bashrc: executed by bash(1) for non-login shells.
# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
# for examples
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
Run Code Online (Sandbox Code Playgroud)
这让我想知道为什么 bashrc 不将配置文件分为 3 组,例如:
~/.bashrc_interactive
~/.bashrc_non_interactive
~/.bashrc_global #(交互式和非交互式)
因此用户只需JAVA_HOME在~/.bashrc_non_interactive或中设置即可~/.bashrc_global,无需在每个守护程序文件中一遍又一遍地添加此环境变量。
是否有任何原因或限制 bashrc 不支持这种方式或任何其他方式的非交互式?或者我误解了一些概念?
我正在为某些事情编写一个非常特别的安装脚本。没有太多的控制结构,基本上只是一个命令列表。我希望用户在执行每个命令之前对其进行确认。有没有办法让 bash 做到这一点,而无需在每个命令前加上 shell 函数名称?
更新:这不是文件系统问题。
\n\n我以前可以输入:
\n\n$ echo k\xc3\xb8dp\xc3\xa5l\xc3\xa6g\nRun Code Online (Sandbox Code Playgroud)\n\n但现在 bash/zsh 将其更改为:
\n\nbash$ echo kddddddddplg\nzsh$ echo k<c3><b8>dp<c3><a5>l<c3><a6>g\nRun Code Online (Sandbox Code Playgroud)\n\n我可以运行cat并输入 \'k\xc3\xb8dp\xc3\xa5l\xc3\xa6g\' 没有问题:
$ cat\nk\xc3\xb8dp\xc3\xa5l\xc3\xa6g\nk\xc3\xb8dp\xc3\xa5l\xc3\xa6g\nRun Code Online (Sandbox Code Playgroud)\n\n这都是在这个环境下:
\n\n$ locale \nLANG=C\nLANGUAGE=C\nLC_CTYPE="C"\nLC_NUMERIC="C"\nLC_TIME="C"\nLC_COLLATE="C"\nLC_MONETARY="C"\nLC_MESSAGES="C"\nLC_PAPER="C"\nLC_NAME="C"\nLC_ADDRESS="C"\nLC_TELEPHONE="C"\nLC_MEASUREMENT="C"\nLC_IDENTIFICATION="C"\nLC_ALL=C\nRun Code Online (Sandbox Code Playgroud)\n\n并在此:
\n\n$ locale \nLANG=da_DK.utf8\nLANGUAGE=da_DK.utf8\nLC_CTYPE="da_DK.utf8"\nLC_NUMERIC="da_DK.utf8"\nLC_TIME="da_DK.utf8"\nLC_COLLATE="da_DK.utf8"\nLC_MONETARY="da_DK.utf8"\nLC_MESSAGES="da_DK.utf8"\nLC_PAPER="da_DK.utf8"\nLC_NAME="da_DK.utf8"\nLC_ADDRESS="da_DK.utf8"\nLC_TELEPHONE="da_DK.utf8"\nLC_MEASUREMENT="da_DK.utf8"\nLC_IDENTIFICATION="da_DK.utf8"\nLC_ALL=da_DK.utf8\nRun Code Online (Sandbox Code Playgroud)\n\ncsh不改变\'k\xc3\xb8dp\xc3\xa5l\xc3\xa6g\'。
如何恢复旧行为,以便我可以输入 \'k\xc3\xb8dp\xc3\xa5l\xc3\xa6g\'?
\n\n运行其中任何一个都会产生旧的行为:
\n\nLC_ALL=en_GB.utf-8 luit\nLC_ALL=da_DK.utf-8 luit\nLC_ALL=en_GB.iso88591 luit\nLC_ALL=da_DK.iso88591 luit\nRun Code Online (Sandbox Code Playgroud)\n\n但仅限于该单一会话。
\n\n这:
\n\n$ od -An -vtx1\n\xc3\xb8\nRun Code Online (Sandbox Code Playgroud)\n\n给出:
\n\n c3 b8 0a\nRun Code Online (Sandbox Code Playgroud)\n\n所以看来从 Konsole 到 bash 的输入是 UTF8。
\n\n$ konsole --version\nQCoreApplication::arguments: Please …Run Code Online (Sandbox Code Playgroud) I'm trying to figure out what words does the -interactive option of cp accepts as input.
For your convenience, here's code that sets up files for experimentation.
touch example_file{1..3}
mkdir example_dir
cp example_file? example_dir
cp -i example_file? example_dir
Run Code Online (Sandbox Code Playgroud)
The shell then asks interactively for each file whether it should be overwritten. It seems to accept all sorts of random input.
cp: overwrite 'example_dir/example_file1'? q
cp: overwrite 'example_dir/example_file2'? w
cp: overwrite 'example_dir/example_file3'? e
Run Code Online (Sandbox Code Playgroud)
I tried looking into the source code …
我想计算交互式删除的文件和目录的数量:
for f in /tmp/mydir/* ; do
rm -ir "$f"
done
Run Code Online (Sandbox Code Playgroud)
如何以最简洁/优雅的方式做到这一点?
例子:
abc@def:/tmp/mydir$ tree
.
??? 1
??? 2
??? 3
??? 4
??? A
? ??? 1
? ??? 2
? ??? 3
??? B
? ??? 1
? ??? 2
??? C
3 directories, 9 files
Run Code Online (Sandbox Code Playgroud)
如果所有答案都是y(是),那么我希望得到答案:
1, 2, 3, 4, A, B, C) 或:1, 2, 3, 4, A/1 …我正在编写一个 shell 脚本来一次性在我的 Ubuntu PC 上安装所有我需要的应用程序(同时我可以散步或做其他事情)。对于大多数应用程序添加-y到apt-get install语句的末尾,已经很好地避免了任何用户参与的需要。我的脚本看起来像这样:
#!/bin/bash
add-apt-repository ppa:webupd8team/sublime-text-3 -y
apt-get update -y
apt-get upgrade -y
apt-get install synaptic -y
apt-get install wireshark -y
Run Code Online (Sandbox Code Playgroud)
虽然我不再需要担心Do you want to continue? [Y/n]或Press [ENTER] to continue or ctrl-c to cancel adding it,但问题在于wireshark,它需要响应如下所示的交互式提示:
我怎样才能避免这种强制性干预?
我使用以下代码作为更大脚本的一部分:
mysql -u root -p << MYSQL
create user '${DOMAIN}'@'localhost' identified by '${DOMAIN}';
create database ${DOMAIN};
GRANT ALL PRIVILEGES ON ${DOMAIN}.* TO ${domain}@localhost;
MYSQL
Run Code Online (Sandbox Code Playgroud)
如您所见,它创建了一个授权的、所有特权的数据库用户,以及一个具有相同值(密码也将具有相同值)的数据库实例。
DB user ====> ${domain}.
DB user password ====> ${domain}.
DB instance ====> ${domain}.
Run Code Online (Sandbox Code Playgroud)
这是有问题的,因为我需要不同的密码。当然,我可以在整个脚本完成执行后从 `${domain} 手动更改密码,但这不是我想要的:
我想要的是直接在执行时以交互方式键入/粘贴密码。
换句话说,我希望提示我输入数据库用户的密码是运行脚本的一个组成部分。
我已经尝试过以下代码,但失败了:
mysql -u root -p << MYSQL
create user '${DOMAIN}'@'localhost' identified by -p;
create database ${DOMAIN};
GRANT ALL PRIVILEGES ON ${DOMAIN}.* TO ${domain}@localhost;
MYSQL
Run Code Online (Sandbox Code Playgroud)
通过在脚本执行中直接键入/粘贴(而不是在脚本执行后手动更改),能够以交互方式插入密码的正确方法是什么?
这个问题为什么系统会变得无响应?接近。答案有点解释了可能发生的事情,但我只是不明白为什么这个问题至少从 80 年代开始就没有得到解决。有什么理论上的原因吗?
具体发生的情况是系统运行良好而没有明显的性能下降,而我的浏览器中有许多选项卡(Firefox 和 Chrome 都会发生)但有时打开新选项卡(或启动其他浏览器)会导致硬盘驱动器不断发出噪音,鼠标/键盘输入响应滞后如此严重,以至于我宁愿冷重启。这为我节省了 10 分钟和大量的白发。
我完全禁用了交换,同样的情况也会发生。内核不应该杀死达到物理内存限制的第一个进程,或者最大的进程?
内核不应该允许任何进程,甚至是有缺陷/恶意的进程,更不用说 Firefox/Chrome,导致无响应的程度,以致最快的出路是冷重启。不管是什么原因。是什么原因?垃圾分类无法识别?不应该自动杀死一个过于“贪婪”的进程,而不是让用户通过重新启动并丢失未保存的数据来手动杀死所有进程?
我知道 SysRq 组合键和 pkill(> 10 分钟),但我不想使用它们中的任何一个。我希望这个问题能自动解决。
我感兴趣的是为什么这在 Linux 中没有解决?
我希望根据我是否在 tmux 会话中来决定 zsh 提示符的颜色。在bash中,可以通过检查$TMUX的值来完成,但我在zsh中找不到等效的方法。在zsh中可以吗?
我正在尝试使用 telnet 和一个命令文件通过远程 shell 访问 SMTP 远程服务器,该命令文件command.txt包含发送到该 SMTP 服务器的命令,如https://tecadmin.net/ways-to-send-email-from-linux上所示-command-line/#(注意:在上面的网站上,这是交互完成的)但在这里我想在命令文件中执行此操作(我刚刚将黄色/红色(用户输入))复制到命令文件中。
HELO yahoo.com
mail from: sender@tecadmin.net
rcpt to: myemail@mail.com
data
Hey
This is test email only
Thanks
.
quit
Run Code Online (Sandbox Code Playgroud)
然后使用telnet IP smtp < command.txtalways返回:
Trying 1.1.65.49...
Connected to 1.1.65.49.
Escape character is '^]'.
Connection closed by foreign host.
Run Code Online (Sandbox Code Playgroud)
而当我与以下人员交互时:
perlhook@bbis:~/temp_25$ telnet 1.1.65.49 smtp
Trying 1.1.65.49...
Connected to 1.1.65.49.
Escape character is '^]'.
220 miraino-manabi.jp ESMTP Postfix
HELO yahoo.com
250 miraino-manabi.jp
mail from: sender@tecadmin.net
250 2.1.0 Ok …Run Code Online (Sandbox Code Playgroud)