我发现越来越多的工具将可执行文件放入 ~/.local/bin。我老了,对我来说 ~/bin 是我的 $HOME 中可执行文件的地方。
这种疯狂的新时尚起源于哪里?人们为什么要这样做?它有多普遍?它在任何地方正式化吗?它不在 XDG 目录规范中。
有一个相关的问题: 哪些发行版在 $PATH 中有 $HOME/.local/bin?
对另一个问题的评论指的是https://www.python.org/dev/peps/pep-0370,它在 2008 年就已经有了: Why did this program install into ~/.local/bin ... thats the first我见过这种情况发生的时间吗?
我在 Linux的命令输出中发现了术语“ LSB可执行文件”或“ LSB共享对象”file。例如:
$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=4637713da6cd9aa30d1528471c930f88a39045ff, stripped
Run Code Online (Sandbox Code Playgroud)
在这种情况下,“LSB”是什么意思?
root即使未设置权限,用户也可以写入文件write。
root即使未设置权限,用户也可以读取文件read。
root即使未设置权限,用户也可以 cd进入目录execute。
root未设置权限时,用户无法执行文件execute。
为什么?
user$ echo '#!'$(which bash) > file
user$ chmod 000 file
user$ ls -l file
---------- 1 user user 12 Jul 17 11:11 file
user$ cat file # Normal user cannot read
cat: file: Permission denied
user$ su
root$ echo 'echo hello' >> file # root can write
root$ cat file # root can read …Run Code Online (Sandbox Code Playgroud) 我在VirtualBox 中安装了 Debian (用于通常破坏我系统的各种实验)并尝试启动 VirtualBox 来宾插件脚本。我以 root 身份登录并尝试启动autorun.sh,但我得到“权限被拒绝”。ls -l表明该脚本具有可执行权限。
抱歉,我无法复制输出——VirtualBox 没有插件绝对没有用,因为共享目录和共享剪贴板都不起作用。但为了让你确定,我手工复制了权利:
#ls -l ./autorun.sh
-r-xr-xr-x 1 root root 6966 Mar 26 13:56 ./autorun.sh
Run Code Online (Sandbox Code Playgroud)
起初我认为可能是脚本执行了一些导致错误的事情。我试图/bin/sh用类似的东西替换#/pathtorealsh/sh -xv,但我没有输出——似乎脚本甚至无法执行。
我什至不知道是什么导致了它。
假设我与可执行文件在同一个文件夹中,我需要输入以下内容来执行它:
./file
Run Code Online (Sandbox Code Playgroud)
我宁愿不必打字/,因为/我很难打字。
有没有更简单的方法来执行文件?理想情况下只是一些简单的语法,例如:
.file
Run Code Online (Sandbox Code Playgroud)
或其他东西,但比必须在/那里插入字符更容易。
也许有某种方法可以在/bin目录中放置一些东西,或者为解释器创建一个别名,以便我可以使用:
p file
Run Code Online (Sandbox Code Playgroud) 我想启动wine可执行文件(版本 2.12),但出现以下错误($=shell 提示):
$ wine
bash: /usr/bin/wine: No such file or directory
$ /usr/bin/wine
bash: /usr/bin/wine: No such file or directory
$ cd /usr/bin
$ ./wine
bash: ./wine: No such file or directory
Run Code Online (Sandbox Code Playgroud)
但是,该文件在那里:
$ which wine
/usr/bin/wine
Run Code Online (Sandbox Code Playgroud)
可执行文件肯定存在并且没有死符号链接:
$ stat /usr/bin/wine
File: /usr/bin/wine
Size: 9712 Blocks: 24 IO Block: 4096 regular file
Device: 802h/2050d Inode: 415789 Links: 1
Access: (0755/-rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-07-13 13:53:00.000000000 +0200
Modify: 2017-07-08 03:42:45.000000000 …Run Code Online (Sandbox Code Playgroud) 多年来,我每天都使用 Linux 系统,并且在系统运行时更新系统从来没有遇到过重大问题,但我仍然想知道为什么这是可能的。
让我举个例子。
假设来自某个包的程序“A”正在系统上运行。该程序在某个时刻需要从同一个包中打开另一个文件(“B”)。之后,程序“A”关闭“B”,因为它不再需要它。假设现在我更新了“A”和“B”所属的包。“A”不受此操作的直接影响,至少目前是这样,因为它在 RAM 中运行并且更新刚刚替换了硬盘上的“A”。假设文件系统上的“B”也被替换了。现在“A”出于某种原因需要再次读取“B”。问题是:“A”是否有可能找到与“B”不兼容的版本并以其他方式崩溃或故障?
为什么没有人通过使用 Live CD 或类似程序重新启动来更新他们的系统?
如何执行命令使其相信与系统日期不同?
例如,如果我有这个脚本:
#!/usr/bin/env bash
date +"%B %d, %Y"
Run Code Online (Sandbox Code Playgroud)
它打印实际日期: march 13, 2014
但我希望它在不更改系统日期的情况下打印未来或过去的不同日期。
如果我还不够清楚,我想要一个像Windows GUI tool这样的命令行工具。
我不想使用不同的脚本(这只是一个例子)。
我不想设置cronjob。
我不想更改我的一般系统日期。
仅更改适用于要运行的命令的日期。
我知道 Linux 使用 shebang 行来确定用于脚本语言的解释器,但它如何用于二进制文件?
我的意思是我可以运行 Linux 二进制文件,并且已经安装了wine和mono、Windows 本机和 .NET 二进制文件。对于所有这些,它只是./binary-name(如果不在 PATH 中)运行它。
Linux 如何确定给定的二进制文件必须作为 Linux 本机二进制文件、Windows 本机二进制文件(使用wine工具)还是作为 Windows .NET 二进制文件(使用单声道工具)运行?
我想知道像 Thunderbird 或 Firefox 这样的杀手级应用程序如何在它们仍在运行时通过系统的包管理器进行更新。旧代码在更新时会发生什么?当我想编写一个在运行时自我更新的程序 a.out 时,我必须做什么?
executable ×10
bash ×2
linux ×2
upgrade ×2
date ×1
elf ×1
fhs ×1
file-format ×1
filenames ×1
files ×1
home ×1
path ×1
permissions ×1
root ×1
shell ×1
terminology ×1
virtualbox ×1
wine ×1