Linux 有一个/proc
目录和文件系统,据我所知,它不是 POSIX 的一部分。在每个/proc/$PID
子目录中,是一个符号链接,cwd
指向该PID进程的实际工作目录(该cwd
链接始终是最新的)。
这个符号链接对于某些用例很方便,比如使用不同的 shell 和在两个 shell 之间交换文件(正式地,它们的工作目录)。
有没有一种简单的方法来获得类似的东西,只使用 POSIX 功能?
发表评论后,更精确:它不一定是链接和环境变量 lile $<PID>_CWD
,也一样好,虽然乍一看,我不相信这样的解决方案存在。它必须易于引用(例如符号链接或环境变量),并且每次其他进程切换其工作目录时始终保持最新。
解决方案不一定是POSIX,最重要的是可移植性,但POSIX肯定是一种保证。
我总是在命令之后写 stdin 重定向,因为对我来说,首先命令然后重定向(如果有)更自然:
some-command < input-file > output-file
Run Code Online (Sandbox Code Playgroud)
多年来,我看到人们在命令之前编写 stdin 重定向,以获得一些流程方向:
< input-file some-command > output-file (or without spaces after < and > )
Run Code Online (Sandbox Code Playgroud)
这个顺序是被 POSIX 接受还是被许多 shell 接受(在我的 Fedora 21 中,它被bash
, dash
, tcsh
,ksh
和接受zsh
)?
在编写一些代码时,我发现这一行:
$ TZ="America/Los_Angeles" date; echo "$TZ"
Thu Dec 24 14:39:15 PST 2015
Run Code Online (Sandbox Code Playgroud)
正确给出“洛杉矶”的实际时间,并且TZ
不保留变量的值。一切都在意料之中。
但是,使用这一行,我曾经扩展了一些格式,并且基本上执行了相同的操作,保留了 TZ 的值:
TZ="America/Los_Angeles" eval date; echo "$TZ"
Thu Dec 24 14:41:34 PST 2015
America/Los_Angeles
Run Code Online (Sandbox Code Playgroud)
经过多次测试,我发现这种情况只发生在某些 shell 中。它发生在 dash、ksh 中,但不发生在 bash 或 zsh 中。
问题是:
我用这两行在几个 shell 中运行了测试:
myTZ="America/Los_Angeles"
unset TZ; { TZ="$myTZ" date; } >/dev/null; echo -n " direct $TZ"
unset TZ; { TZ="$myTZ" eval date; } >/dev/null; echo " evaled $TZ"
Run Code Online (Sandbox Code Playgroud)
结果如下:
/bin/ash : direct evaled America/Los_Angeles
/bin/dash : …
Run Code Online (Sandbox Code Playgroud) 找出有关文件的文件系统信息的最佳方法是什么。
例如,如果我有一个文件
/media/xyz/path/to/file.ext
Run Code Online (Sandbox Code Playgroud)
并/etc/fstab
包含
//server1/Share1 /media/xyz cifs option1=value1,...
Run Code Online (Sandbox Code Playgroud)
我如何确定文件是否在 Samba 共享上,它具有本地路径/path/to/file.ext
以及文件系统安装的选项?
正在解析mount
便携式解决方案的输出吗?还是解析findmnt
?是否有符合 POSIX 标准的方法来实现这一目标?
一个答案到这个问题提到了OSX的UNIX 03认证。现在 AFAIK OSX 的标准文件系统是/曾经是HFS,它“保存了创建或重命名但在操作中不区分大小写的文件的情况”(即它保留大小写但不区分大小写)。
UNIX 认证或 POSIX 是否需要区分大小写的文件系统?
我知道有些 shell 接受这种测试:
t() { [[ $var == *$'\n'* ]] && res=yes || res=no
printf '%s ' "$res";
}
var='ab
cd'
t
var='abcd'
t
echo
Run Code Online (Sandbox Code Playgroud)
执行时:
$ bash ./script
yes no
Run Code Online (Sandbox Code Playgroud)
什么是 POSIX(破折号)工作等效项
以下是可靠的测试方法吗?
nl='
'
t() { case "$var" in
*$nl* ) res=yes ;;
* ) res=no ;;
esac
printf '%s ' "$res"
}
var='ab
cd'
t
var='abcd'
t
echo
Run Code Online (Sandbox Code Playgroud)POSIX 是否要求stdin
0、1stdout
和stderr
2 或者这只是一个约定?其他系统是否与该约定不同,或者这是一个安全的假设?
我真正想念的一件事awk
是使用分隔符连接数组的能力,就像join
Perl 中的命令一样,通常用于立即输出。
相反,我最终编写了类似的代码
for (key in array)
joined_string = (joined_string == "" ? array[key] : joined_string "," array[key])
print joined_string
Run Code Online (Sandbox Code Playgroud)
或者
joined_string = array[1]
for (i = 2; i <= length(array); ++i)
joined_string = joined_string "," array[i];
print joined_string
Run Code Online (Sandbox Code Playgroud)
但是,awk
如果我更改当前字段,可能会为我执行此操作:
OFS="," # (would probably do this in BEGIN)
n = 0
for (key in array)
$(++n) = array[key]
print
Run Code Online (Sandbox Code Playgroud)
我相信这是完全合法的。但是,如果当前输入记录的字段多于array
数组的条目(“垃圾”将是来自输入文件的数据),这将在输出中产生垃圾。因此,能够做到这一点会很好
OFS = "," # (would …
Run Code Online (Sandbox Code Playgroud) 我想将两个数字与bc
. 根据StackOverflow 上这个高度评价的答案,我可以这样做:
printf '%s\n' '1.2 > 0.4' | bc
Run Code Online (Sandbox Code Playgroud)
bc
发送1
到 STDOUT,表明该语句为真(如果该语句为假,它将返回 0)。
与所有其他运算符不同,关系运算符( '<', '>', "<=", ">=", "==", "!=" )仅作为 if、while、或在 for 语句中。
也许我误解了,但是这种语言似乎不允许使用上面示例中使用的语法。
单独使用关系运算符是否bc
违反 POSIX?如果是这样,我应该如何重写我的例子?