Java Unix shell:如何确保命令对最常见的shell有效?

Java Unix shell:如何确保命令对最常见的shell有效?,java,bash,shell,unix,Java,Bash,Shell,Unix,我有一些java代码,它使用jsch连接到unix服务器并在下面的命令下运行 ls-lt/tempdirectory/grep-v“^do | grep”$”(日期“+%b%e”)”头 -1 | awk'{打印%9}' 上面的命令以长格式显示/tempdirectory中的所有文件(第一个管道删除目录)。然后从结果中筛选今天创建的所有文件(即,它greps表示“Oct 16”)由于我做了ls-lt,文件是按时间排序的,所以当我对head-1进行管道传输时,我今天将得到最新的文件。然后最后一个管道

我有一些java代码,它使用jsch连接到unix服务器并在下面的命令下运行

ls-lt/tempdirectory/grep-v“^do | grep”$”(日期“+%b%e”)”头 -1 | awk'{打印%9}'

上面的命令以长格式显示/tempdirectory中的所有文件(第一个管道删除目录)。然后从结果中筛选今天创建的所有文件(即,它greps表示“Oct 16”)由于我做了ls-lt,文件是按时间排序的,所以当我对head-1进行管道传输时,我今天将得到最新的文件。然后最后一个管道将打印出文件名

在一个普通的putty终端上,一旦我切换到BashShell并运行上面的命令,它就会正确地打印出今天最新的文件

但是默认的shell似乎是Bourne(-sh),上面的命令将失败(因此我的代码将失败)

有没有办法创建对普通shell安全的上述命令?我认为我在工作中看到的主要shell有:

伯恩(上海) 又是伯恩(猛击)
Korn(ksh)

这是您应该使用
find(1)
命令的地方:

$ find /tmpdir -type f -ctime -1 
获取当前创建(ctime)的
/tmpdir
中的所有文件

如果你想要所有的文件,那么你不需要更多的修改器。如果你想进一步限制,请参阅GNU查找手册页


find(1)
命令独立于您可以访问远程计算机上的哪个shell。

您发布的代码

ls-lt/grep-v'^do | grep“$”(日期'+%b%e')“| head-1 | awk'{print%9}”

有语法错误,无法在任何shell中运行

固定到

 ls -lt  /tempdirectory/ | grep -v '^d' | grep "$(date '+%b %e')" | head -1 | awk '{print $9}'

它与ANSI兼容,在
sh
bash
zsh
中运行(我已经测试过)。

根据评论,我发现了问题。Bourne无法处理$(…),因此我需要将其替换为-->`重要的是文件从今天午夜开始创建。我使用(touch-a-m-t 202010152359.59 test1.txt)创建了测试文件并修改了它们的日期,还创建了边缘案例,比如在晚上11:59和午夜后创建的文件以及昨天凌晨1点创建的文件。看起来你的命令只是找到了所有的文件。我还尝试将ctime替换为mtime,但我可以看到它打印除昨天凌晨1点生成的文件外的所有文件(即,它似乎查找过去24小时内的所有文件,而不是今天午夜后的所有文件)我尝试在链接中使用daystart参数,但在bash和bourne中尝试时,似乎出现了错误的参数选项错误?如果您有一个带有适当时间戳的引用文件,您可以使用
-cnewer/path/to/reference/file
来创建该文件之后的所有内容。同样,对于mtime(修改)和atime(访问),很遗憾我没有参考文件。您可以使用
touch
touch-t“$(日期+%Y%m%d0000”)“参考文件”
您好,很抱歉我在手机上键入的语法错误。问题是,当我在sh中运行命令时,它不会返回任何内容(而在bash中,它会返回今天的文件)。据我所知,问题似乎来自grepdate命令。即使我将答案直接复制粘贴到控制台中,如果我在sh中输入:echo$(日期'+%b%e'),它也不会工作,我会得到语法错误:'('出乎意料。但是如果我在bash中运行此命令,它会按预期输出日期。我搜索了错误,发现伯恩(sh)无法处理$(),因此我将其替换为'`(另一个奇怪的appostrophe)。有了这个,整个命令现在似乎可以在sh和bash中工作。虽然很有趣,但我的jsch exec程序在ArrayIndexOutOfBounds中出错异常:索引1长度超出界限1发现我的java错误是由于其他原因失败的,而不是由于我的命令。现在一切似乎都可以工作了!感谢您的帮助,请始终从命令行复制粘贴代码,不要重新键入。请注意,在现代系统上,
sh
不是Bourne而是POSIX sh。1992年的标准(与1970年代的Bourne相比)要求包含
$(…)
。我强烈反对任何关于POSIX之前的Bourne是“普通”的断言2020年。据我所知,在过去20年中,唯一一家销售real Bourne的操作系统供应商是Sun。其他所有人都在使用真正的POSIX
sh
。啊,我的操作系统是sunOS-hahaThere,也可能是系统上的POSIX-sh。我想说的是类似于
/usr/xpg/bin/sh