我了解交互式 shell 和非交互式 shell 之间的基本区别。但是,登录 shell 与非登录 shell 的确切区别是什么?
你能举例说明非登录交互式shell 的使用吗?
是~/.bashrc
唯一指定用户特定环境变量、别名、PATH
变量修改等的地方吗?
我问是因为这似乎~/.bashrc
是bash
-only,但其他 shell 也存在......
Unix的系统管理员那里我的工作是不愿意给我访问我的登录shell从改变ksh
到bash
。他给出了各种借口,最有趣的是因为他们编写了所有脚本,ksh
因为如果我尝试运行它们,它们将无法工作。我不知道他从哪里得到这些想法,但既然我无法说服他,我还有其他选择吗?
(chsh
安装在这些机器上,但我们使用公钥/私钥对登录,我没有任何密码,所以当chsh
提示我输入密码时,我没有什么可以提供的。)
这个问题是通过询问Chromium 浏览器不允许为“打印到文件”设置默认纸张大小的问题
以及在聊天中与@Gilles 进行对话而激发的。正如@don_crissti 所指出的,并经我证实,更改语言环境(至少LC_PAPER
)会影响选择的纸张尺寸。
我从来没有想过要选择什么,而且总是选择,en_US.UTF-8
因为这似乎是一个合理的默认选择。
但是,根据聊天中的@Gilles(请参阅从http://chat.stackexchange.com/transcript/message/17017095#17017095开始的对话)。摘录:
吉尔斯:LC_PAPER 默认为 $LANG
吉尔斯:你必须有 LANG=en_US.UTF-8。这是一个坏主意:它设置了 LC_COLLATE 而这几乎总是一件坏事
Gilles:LC_COLLATE 没有描述正确的排序规则,它太严格了(它逐个字符)删除 LANG 而是设置 LC_CTYPE 和 LC_PAPER
Gilles:加上 LC_MESSAGES 如果你想要非英语的消息
显然,这里有一些我不知道的问题,我相信还有很多其他问题。那么,在设置语言环境时应该考虑哪些问题,又应该如何设置呢?我一直只是dpkg-reconfigure locales
在 Debian 中运行,并没有三思而后行。
具体问题:我应该将语言环境设置为 en_IN.UTF-8 吗?这样做有什么缺点吗?
据我所知,交互shell可能登录也可能不登录,它们的启动文件是不一样的。
/etc/profile
然后第一个可读的~/.bash_profile
, ~/.bash_login
, 和~/.profile
/etc/bash.bashrc
然后~/.bashrc
每次使用交互式 shell 时,我都想设置一些变量,无论它是否是登录 shell。
Unix
设置个人环境变量有约定吗?我读到它们应该被放入$HOME/.bash_profile
而不是$HOME/.bashrc
. 尽管如此,我正在考虑提供一种方法来区分我自己的变量。这样即使我忘记了,我也能一眼看出它是否是我设置的。例如,当我在终端中进行自动完成时,我可以使我的变量以下划线或减号“m”开头,就像C++
语言约定之一一样。我知道可能没有绝对的答案,但我想听听一些有助于实现此目的的良好实践和约定:提供一种简单的方法来区分系统环境变量和个人环境变量。
我的脚本(status.sh)是:
#!/bin/bash
SITE=http://www.example.org/
STATUS=$(/usr/bin/curl -s -o /dev/null -I -w "%{http_code}" $SITE)
if [ $STATUS -eq 200 ]
then
echo $STATUS >> /home/myuser/mysite-up.log
else
echo $STATUS >> /home/myuser/mysite-down.log
fi
Run Code Online (Sandbox Code Playgroud)
我跑:
$ chmod +x /home/myuser/status.sh
Run Code Online (Sandbox Code Playgroud)
然后在我的 crontab 上我得到了:
* * * * * /home/myuser/status.sh
Run Code Online (Sandbox Code Playgroud)
当我运行时:
$ /home/myuser/status.sh
Run Code Online (Sandbox Code Playgroud)
该文件/home/myuser/mysite-up.log
包含:
200
Run Code Online (Sandbox Code Playgroud)
但是当 cron 运行时,该文件/home/myuser/mysite-up.log
包含:
000
Run Code Online (Sandbox Code Playgroud)
我做错了什么?
编辑: 我修改了脚本添加:
set -x
Run Code Online (Sandbox Code Playgroud)
正如@Sobrique 所建议的,我的输出是:
SITE=http://www.example.org/
/usr/bin/curl -s -o /dev/null -I -w '%{http_code}' http://www.example.org/
STATUS=000
'[' 000 -eq 200 ']'
echo 000
Run Code Online (Sandbox Code Playgroud)