对使用返回状态代码shell脚本感到困惑?

时间:2015-12-26 18:38:05

标签: linux bash shell unix

在一本书中,我正在阅读以下内容

ls "$1" 2>/dev/null | grep "$1" 2>/dev/null 1>&2

当写入脚本时 - 通过书中它说“执行该命令以检查作为命令行参数传递的文件是否存在。标准错误被重定向到/dev/null(unix black通过使用1>&2将标准输出重定向到标准错误。因此,该命令不会产生任何输出或错误消息;它唯一的puprose是设置命令返回状态值$?。 / EM>“

但运行代码:

if [ $? -eq 0 ]

我不知道其他情况,我在开始时尝试没有cmd,并且对结果没有影响。我确信作者会为某些目的写作。我不能只想出什么?

near complete code

1 个答案:

答案 0 :(得分:2)

这看起来像一本非常糟糕的书,给出了一些没有理智的代码,这些代码通常用于描述通常在shell脚本中以完全不同的方式使用的概念。

该行:

ls "$1" 2>/dev/null | grep "$1" 2>/dev/null 1>&2

如上所述 - 除了设置返回码之外没有其他可见效果。您是否有关于此操作的详细信息,以获取返回代码或其他内容?

该行:

if [ $? -eq 0 ]

是一个不完整的片段,用于检查上一个命令的返回码。它不完整,因为没有thenfi,如果没有if [ $? -eq 0 ]; then echo YES; else echo NO; fi YES,shell会拒绝它作为语法错误而不做任何事情(如果您在提示符下输入上述内容,则为&#39} ; ll得到辅助提示,告诉你shell正在等待更多输入以获得完整的命令)。因此,没有更多的代码,没有明显的效果。比较完整的东西:

NO

会根据返回代码输出ls if [ ! -e "$1" ]; then echo "$1: not found" exit 1 fi

ls开头的6行更合理的方法是:

ls

关于$1行实际执行的操作,它以grep中的名称作为参数运行$?(列表文件),然后使用$?搜索列出相同的文件名。

因此,如果该文件不存在,则ls会出错并且不输出任何内容,因此grep失败(将$1设置为1)。如果文件名存在且不是目录,则grep将成功(将-设置为0)。最后,如果文件名存在并且是一个目录,它将搜索该目录的内容,查找与子字符串同名的任何文件或子目录 - 这可能只是一个错误。另外,如果extern "C" { __declspec(dllexport) int _cdecl extractFisAndCreateGeotiff(char* fisFile, char* infoFisFile, char *tifFile, bool allLayers, double latitude, double longitude, double realX, double realY, double heading); } int extractFisAndCreateGeotiff(char* fisFile, char* infoFisFile, char* geotifFile, bool allLayers, double latitude, double longitude, double heading, double realLength, double realWidth) { //GET LCMS SENSOR INFO if(!getLCMSInfo(fisFile)) if(!getLCMSInfo(infoFisFile)) return NO_LCMS_INFO; vector<Mat> fisData = extractFisData(allLayers, info, std::string(fisFile)); saveAsGeoTiff(std::string(geotifFile), allLayers, fisData, latitude, longitude, realLength, realWidth, heading); return SUCCESS; } //FUNCTION TO EXTRACT BUFFERS FROM FIS FILE vector<Mat> extractFisData(bool allLayers, LcmsSystemInfo info, string fisFileName) { int nLayers = (allLayers) ? NUM_PAGES_ALL : NUM_PAGES_STRIPPED; vector<Mat> fisData(nLayers); GetIntensityImage(fisFileName, &info, fisData[0]); GetRangeImage(fisFileName, &info, fisData[1]); if(allLayers) { getLeftAndRightIntensity(fisData[2], fisData[3], &info); getLeftAndRightRange(fisData[4], fisData[5], &info); } for (int i=0; i<nLayers; i++) flip(fisData[i], fisData[i], 0); return fisData; } //FUNCTION TO CREATE GEOTIFF GIVEN THE BUFFERS void saveAsGeoTiff(string geoTifName, bool allLayers, vector<Mat> fisData, double lattitude, double longitude, double imageLatDist, double imageLongDist, double heading) { int num_pages = (allLayers) ? NUM_PAGES_ALL : NUM_PAGES_STRIPPED; TIFFSetErrorHandler(NULL); TIFFSetWarningHandler(NULL); augment_libtiff_with_custom_tags(); TIFF *tiffdata = TIFFOpen(geoTifName.c_str(), "w"); for(int page = 0; page<num_pages; page++) { setCoreTiffTags(tiffdata, page, num_pages, fisData[page]); if(page==0) { setCustomTiffTags(tiffdata, allLayers); setGeoTiffTags(tiffdata, lattitude, longitude, imageLatDist, imageLongDist, heading, fisData[page]); } TIFFWriteEncodedStrip(tiffdata, 0, static_cast<void *>(fisData[page].data), fisData[page].rows*fisData[page].step[0]); TIFFWriteDirectory(tiffdata); } TIFFClose(tiffdata); } 是一个以[DllImport("roadware.Algorithm.GeotiffProcessor.dll", CallingConvention = CallingConvention.Cdecl)] private static extern int extractFisAndCreateGeotiff(String fisFile, String infoFisFile, String tifFile, bool allLayers, double latitude, double longitude, double realX, double realY, double heading); private void CreateGeotifFiles(List<string> fisFilesList, string infoFisFile, List<string> tiffFilesList, List<double> geoPositions, List<double> fisRealSizes, List<double> headings) { ParallelOptions po = new ParallelOptions(); po.MaxDegreeOfParallelism = Environment.ProcessorCount * 2; Parallel.For(0, fisFilesList.Count, po, i => //for (int i = 0; i < fisFilesList.Count; i++) { extractFisAndCreateGeotiff(fisFilesList[i], infoFisFile, tiffFilesList[i], this.settings.ExtractAll, geoPositions[i * 2], geoPositions[i * 2 + 1], fisRealSizes[i * 2], fisRealSizes[i * 2 + 1], headings[i]); } ); } 开头的字符串,它会做一些相当无用且不可预测的事情。

总的来说,一个永远不应该写的shell脚本的一个主要例子 - 任何变成这种怪物的学生应该立即获得F。