“cat x y z> z”如何运作?

时间:2017-07-10 06:45:40

标签: linux bash

我有三个文件x,y和z以及一些内容。

如果我运行$cat x y z > z,它似乎在将x和y写入z之前截断文件z。

我希望它只是将x,y和z的内容连接成到z中。有人可以解释为什么不是这样吗?另请解释我收到的这个警告

$ echo "one" > x
$ echo "two" > y
$ echo "three" > z
$ cat x y z 
  one
  two
  three
$ cat x y z > z
  cat: z: input file is output file
$ cat z
  one
  two

2 个答案:

答案 0 :(得分:5)

shell正在>z上运行,在z开始之前打开cat输出并截断它。 cat通过针对每个输入的inode检查stdout的inode来保护您免受无限循环(无限直到磁盘已满)。

答案 1 :(得分:-1)

public class XmlReader { List<Season> Seasons; private Season season; private String text; public XmlReader() { Seasons = new ArrayList<Season>(); } public List<Season> getSeasons() { return Seasons; } public List<Season> parse(InputStream is){ XmlPullParserFactory factory = null; XmlPullParser parser = null; try { factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); parser = factory.newPullParser(); parser.setInput(is, null); int eventType = parser.getEventType(); while(eventType != XmlPullParser.END_DOCUMENT) { String tagname = parser.getName(); switch (eventType) { case XmlPullParser.START_TAG: if (tagname.equalsIgnoreCase("season")) { season = new Season(); season.setSeason_id( (Integer.parseInt(parser.getAttributeValue(0)) ) ); season.setSeason_name( parser.getAttributeValue(1) ); } break; case XmlPullParser.END_TAG: if (tagname.equalsIgnoreCase("season")) { seasons.add(season); } else if (tagname.equalsIgnoreCase("page")) { season.setPage_id(Integer.parseInt(parser.getAttributeValue(0))); season.setPage_text( parser.getAttributeValue(1) ); } break; default: break; } eventType=parser.next(); } } catch (XmlPullParserException | IOException e) { e.printStackTrace(); } return season; } } 覆盖运算符的RHS上的文件,而>将LHS操作数附加到RHS操作数。你应该试试>>。 如果您使用的是>>,则可以使用此功能。