我知道有/etc/profile,并/etc/bashrc设置全局环境变量,也许我只是误解他们的目的文件,但...
有全局bash_profile文件吗?
我使用的是 Mac OS X
在 htop 或其他显示进程状态的命令中,所有 bash 进程都在命令列中
/bin/bash
Run Code Online (Sandbox Code Playgroud)
但是一个进程在命令列中
-bash
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
我已经在几个地方读过PATH设置/etc/profile或.profile主目录中的文件。
这些是路径设置的唯一地方吗?我想更好地理解它。
在/etc/profile文件中,如以下注释所述"system-wide .profile file for the Bourne shell"。这是否意味着配置文件是 bash 的主要配置文件?
在那个文件中,我根本没有看到PATHvar 被设置。在.profile主目录中的文件中有这一行:
PATH="$HOME/bin:$PATH"
Run Code Online (Sandbox Code Playgroud)
这是PATH通过外观重置的,因为它将已经设置的$PATH字符串与$HOME/bin:正确的字符串连接起来?但是,如果etc/profile和~/.profile是唯一的文件上设置PATH其中$PATH在该行的代码来了,如果它不定义/etc/profile?
有经验的人可以对PATH变量进行广泛而详细的解释吗?谢谢!
我用开在Ubuntu终端Ctrl+ Alt+ T,并通过进入到一个目录,然后右击并选择“打开在终端”不同的终端。
我echo $0在这两种情况下都做了。
在第一种情况下:
$ echo $0
-bash
Run Code Online (Sandbox Code Playgroud)
在第二种情况下:
$ echo $0
/bin/bash
Run Code Online (Sandbox Code Playgroud)
为什么会有这种差异?
我知道交互式/非交互式和登录/非登录 shell 之间的区别是什么,但在实践中似乎永远不会有非交互式登录shell,除非您/bin/bash --login some-script.sh在脚本中有类似的东西(甚至看起来有点奇怪)。这是正确的还是它们更常见?
我很好奇这些程序之间的区别是什么;通过 systemctl 启用时使用 systemd 启动,而/etc/rc.local通过 CLI 或通过 CLI启动的启动。
例如,我最近在树莓派上使用 shairport-sync。最初,我通过启用 sudo systemctl 的 shairport-sync 将 shairport-sync 设置为启动。
后来我使用其中的一个功能在shairport-sync连接设备之前运行脚本并发布。
令我惊讶的是,执行时的脚本shairport-sync没有kill arecord或aplay
然而,当我将通过终端执行,杀死了脚本运行脚本arecord和aplay。
为了进一步混淆自己,我shairport-sync通过终端杀死并启动它以查看正在发生的事情的输出。当我这样做时,当设备连接并杀死arecord和aplay. 所以,作为一个修复我禁用shairport-sync的sysmtectl,并设置它在运行/etc/rc.local作为一个快速修复。之后reboot它按我的预期运行。
这让我相信作为一部分运行systemd的程序与通过/etc/rc.local或 CLI启动时运行的程序之间存在一些差异。
为什么会发生这种情况?这是因为运行级别不同吗?什么黑魔法?
设备连接时运行的脚本shairport-sync如下:shairportstart.sh
#!/bin/sh
/usr/bin/sudo /bin/pkill arecord
if [ $(date +%H) -ge "18" -o $(date +%H) -le "7" ]; then
/usr/bin/amixer set …Run Code Online (Sandbox Code Playgroud) 在解释这个流程图时
我在 man bash 中发现:
当 bash 作为交互式登录 shell 或作为具有 --login 选项的非交互式 shell 调用时,它首先从文件 /etc/profile 读取并执行命令(如果该文件存在)。
这表明交互式登录shell 读取/etc/profile(没有 --noprofile)
此外,选项为read 的非交互式shell--login/etc/profile
这似乎留下一些可能的登录炮弹(其中$0一个开始-),其被非交互式(运行脚本,也许就这么简单date)可能无法读取(源)/etc/profile。
确认或否认这个想法:
首先,我尝试使用su -l -,它以 a-作为第一个字符启动登录外壳,但我未能使其非交互式(并且能够提供测试来探测它)。
调用类似的东西
$ bash -c 'date' -bash
Run Code Online (Sandbox Code Playgroud)
不报告为登录 shell(即使第一个字符是 a -)。
试试这个来揭示细节:
Run Code Online (Sandbox Code Playgroud)$ bash -c 'echo "$0 $- ||$(shopt -p login_shell)||";date' -bash -bash hBc ||shopt -u login_shell|| Fri …
问题“ .bashrc 的目的是什么以及它是如何工作的? ”寻求.bashrc的目的和用途.bashrc。另一个具有相似名称的文件是.bash_logout.
这个文件应该首先存在吗?如果有,这个文件的作用是什么?
据我所知,交互shell可能登录也可能不登录,它们的启动文件是不一样的。
/etc/profile然后第一个可读的~/.bash_profile, ~/.bash_login, 和~/.profile /etc/bash.bashrc然后~/.bashrc每次使用交互式 shell 时,我都想设置一些变量,无论它是否是登录 shell。
当我$PATH像下面那样输入时,输出开始, -bash:然后是$PATHthen的值,最后它打印,: No such directory
而输出echo $PATH不产生该输出。
是否readline涉及bash ?
[user1@Server1 ~]$ $PATH
-bash: /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin: No such file or directory
Run Code Online (Sandbox Code Playgroud)
当我只做echo $PATH输出时:
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin
Run Code Online (Sandbox Code Playgroud)