在一本书中,我正在阅读以下内容
ls "$1" 2>/dev/null | grep "$1" 2>/dev/null 1>&2
当写入脚本时 - 通过书中它说“执行该命令以检查作为命令行参数传递的文件是否存在。标准错误被重定向到/dev/null
(unix black通过使用1>&2
将标准输出重定向到标准错误。因此,该命令不会产生任何输出或错误消息;它唯一的puprose是设置命令返回状态值$?
。 / EM>“
但运行代码:
if [ $? -eq 0 ]
我不知道其他情况,我在开始时尝试没有cmd,并且对结果没有影响。我确信作者会为某些目的写作。我不能只想出什么?
答案 0 :(得分:2)
这看起来像一本非常糟糕的书,给出了一些没有理智的代码,这些代码通常用于描述通常在shell脚本中以完全不同的方式使用的概念。
该行:
ls "$1" 2>/dev/null | grep "$1" 2>/dev/null 1>&2
如上所述 - 除了设置返回码之外没有其他可见效果。您是否有关于此操作的详细信息,以获取返回代码或其他内容?
该行:
if [ $? -eq 0 ]
是一个不完整的片段,用于检查上一个命令的返回码。它不完整,因为没有then
或fi
,如果没有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。