无法在Cygwin中将shell脚本作为KornShell脚本执行

pb3s4cty  于 8个月前  发布在  Shell
关注(0)|答案(5)|浏览(66)

我很少接触shell脚本,我们有另一个部门编写它们,所以我对编写它们有一定的了解,但没有经验。但是,他们对我的问题似乎都毫无用处。
我试图执行一些KornShell(ksh)脚本在基于Windows的机器上使用Cygwin-我们使用这些来启动我们的Oracle服务器,现在它根本不会执行。我曾经能够在我的旧机器上很好地执行这些完全相同的脚本。
现在我已经把它缩小到“幻数”或脚本开头的任何东西,它指定了脚本解释器的路径:
即:
#!/bin/ksh
如果我把它改为作为一个简单bash来执行,它就可以工作了,即:
#!/bin/sh
我检查了为cygwin安装的软件包-现在我安装的shell是:

  • mksh MirdBSD KornShell
  • Bash the bourne again shell
  • zsh z shell

我应该在cygwin/bin目录中看到ksh.exe吗?有一个系统文件'ksh',我假设它与其他shell exes之一相关联,如mksh.exe
我知道我的解释可能很蹩脚。但话虽如此,任何帮助将非常感谢。
谢谢.

bvjxkvbb

bvjxkvbb1#

MirBSD Korn shell的名字是mksh。您可以验证这一点,并通过键入以下命令查找正确的路径

% which mksh
% which ksh

或者如果你没有which

% type -p mksh
% type -p ksh

或者如果也失败了,检查/etc/shells,它应该列出系统上所有有效的shell:

% grep ksh /etc/shells

您需要将完整路径放在#!行之后。它可能是/bin/mksh,所以你的行需要看起来像这样:

#!/bin/mksh
gab6jxml

gab6jxml2#

你现在可能已经修复了它,但答案是否定的,你的Cygwin(还)不知道ksh。
我通过在命令行模式下使用-P ksh属性(如http://www.ehow.com/how_8611406_install-ksh-cygwin.html中所述)启动cygwin安装程序解决了这个问题。

pkwftd7m

pkwftd7m3#

您可以使用bat文件运行ksh
C:\cygwin\bin\dos2unix kshfilename.ksh
C:\cygwin\bin\bash kshfilename.ksh
Running a shell script through Cygwin on Windows

tkqqtvp1

tkqqtvp14#

通过以下步骤将KornShell(ksh)安装到Cygwin中:
1.下载:ksh.2012-08-06.cygwin.i386.gz
1.通过Cygwin安装ksh。
1.外展Cygwin setup.exe
1.选择:* 从本地目录安装 *
1.选择 ksh.2012-08-06.cygwin.i386.gz 作为 * 本地包目录 *。

1.完整的Cygwin设置。
1.重新启动Cygwin。

r6hnlfcb

r6hnlfcb5#

我意识到这是非常延迟的,但如果其他人有同样的问题,我有,我使用了Asurya描述的相同过程,通过试验和错误得到了一些额外的澄清/提示:
1.安装cygwin
1.打开Windows PowerShell
1.导航到Cygwin的安装位置(对我来说是C:\cygwin64)
1.运行带有附加标志“-P ksh”的Cygwin安装程序exe(我运行:setup-x86_64.exe -P ksh)。
1.您也可以通过在该调用后附加--no-admin来执行单用户安装(不需要管理员权限):setup-x86_64.exe -P ksh --no-admin
1.在Cygwin中使用以下语法(不带引号)运行代码:“mksh filename.ksh”或“ksh filename.ksh”-这两个是等效的,因为ksh系统文件只是链接到bin文件夹中的mksh.exe文件。
1.除了上面的语法,你还可以确保正确的shebang行位于文件的顶部(例如,#!/bin/ksh),并通过简单地调用(无引号)“./filename.ksh”来运行代码。
额外的笔记/我发现有用的东西:

  • 您还可以通过在Cygwin中输入(不带引号)“ksh”或“mksh”来激活ksh子shell,但语法保持不变。通过键入(无引号)“exit”退出。
  • 您可以使用命令(无引号)“cd /cygdrive/c/rest_of_directory”(source)切换到C:\中的目录
  • 您可以通过在.ksh文件中使用Linux“set“命令来添加调试功能。我添加了(没有引号)“set -x”作为文件的新的第一行,然后在执行过程中打印每个命令参数。特别是对于更神秘的错误有帮助,比如“path/file 2 [1]不是标识符”,这是我在从原始脚本中执行其他文件/脚本时遇到的。

相关问题