{"id":13584,"date":"2020-08-10T17:20:06","date_gmt":"2020-08-10T08:20:06","guid":{"rendered":"https:\/\/its-more.jp\/ja_jp\/?p=13584"},"modified":"2020-08-11T06:06:17","modified_gmt":"2020-08-10T21:06:17","slug":"%e7%b6%9a%e3%80%85gshell","status":"publish","type":"post","link":"https:\/\/its-more.jp\/ja_jp\/?p=13584","title":{"rendered":"\u7d9a\u3005GShell"},"content":{"rendered":"\n<p>\u958b\u767a\uff1a\u3055\u3066\u3001<a href=\"https:\/\/its-more.jp\/ja_jp\/?p=13428\">1000\u884c\u3042\u308c\u3070shell\u307d\u3044\u3082\u306e\u306b\u306a\u308b<\/a>\u304b\u306a\u3068\u601d\u3063\u3066\u3044\u305f\u306e\u3067\u3059\u304c\u3001\u8d85\u3048\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u3002\u307e\u3060\u307e\u3060\u5148\u306f\u9060\u3044\u304b\u306a\u3068\u3044\u3046\u611f\u3058\u3067\u3059\u3002<\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Gshell-by-SatoxITS.pdf\">Gshell-by-SatoxITS<\/a><a href=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Gshell-by-SatoxITS.pdf\" class=\"wp-block-file__button\" download>\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/a><\/div>\n\n\n\n<p>\u958b\u767a\uff1a\u79c1\u81ea\u8eab\u306fshell\u3092\u3068\u3066\u3082\u30b7\u30f3\u30d7\u30eb\u306b\u3057\u304b\u4f7f\u308f\u306a\u3044\u306e\u3067\u3059\u304c\u3001\u4e00\u65b9\u3067\u30d2\u30b9\u30c8\u30ea\u30fc\u6a5f\u80fd\u3068\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u91cf\u306e\u8a18\u9332\u306f\u975e\u5e38\u306b\u91cd\u8981\u3060\u3068\u601d\u3063\u3066\u3044\u307e\u3059\u3002\u305d\u308c\u3067\u3001\u3069\u306e\u30b3\u30de\u30f3\u30c9\u3092\u3069\u3053\u3067\u5b9f\u884c\u3057\u3066\u3069\u306e\u304f\u3089\u3044\u306e\u30ea\u30bd\u30fc\u30b9\u4f7f\u7528\u3060\u3063\u305f\u304b\u3068\u3044\u3046\u306e\u3092\u8a18\u9332\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3057\u305f\u3002\u3042\u3068\u3001\u3055\u3063\u304d\u3044\u305f\u3042\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u623b\u308a\u305f\u3044\u3068\u3044\u3046\u3053\u3068\u304c\u591a\u3044\u306e\u3067\u3001\u4f5c\u696d\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306e\u30d2\u30b9\u30c8\u30ea\u3092\u4f5c\u308b\u3053\u3068\u306b\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u307e\u305a\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u79fb\u52d5\u306e\u30d2\u30b9\u30c8\u30ea\u306f\u3053\u3093\u306a\u611f\u3058\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"321\" height=\"429\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-17.40.08.png\" alt=\"\" class=\"wp-image-13594\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-17.40.08.png 321w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-17.40.08-224x300.png 224w\" sizes=\"(max-width: 321px) 100vw, 321px\" \/><\/figure>\n\n\n\n<p>\u958b\u767a\uff1a\u30b3\u30de\u30f3\u30c9\u306e\u30d2\u30b9\u30c8\u30ea\u306f\u3053\u3093\u306a\u611f\u3058\u3067\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"566\" height=\"510\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-17.52.34.png\" alt=\"\" class=\"wp-image-13597\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-17.52.34.png 566w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-17.52.34-300x270.png 300w\" sizes=\"(max-width: 566px) 100vw, 566px\" \/><\/figure>\n\n\n\n<p>\u793e\u9577\uff1a\u300c\u3042\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3057\u305f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u623b\u308a\u305f\u3044\u300d\u3068\u3044\u3046\u4e8b\u304c\u591a\u3044\u306e\u3067\u3001cd\u306e\u5f8c\u306e\uff01\u756a\u53f7\u3082\u30b3\u30de\u30f3\u30c9\u306e\u30d2\u30b9\u30c8\u30ea\u306e\u3082\u306e\u3092\u4f7f\u3048\u308b\u306e\u304c\u826f\u3044\u3088\u3046\u306b\u601d\u3044\u307e\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u79c1\u3082\u305d\u3046\u601d\u3044\u307e\u3057\u305f\u3002\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u79fb\u52d5\u306e\u30d2\u30b9\u30c8\u30ea\u306f\u3001\u30b3\u30de\u30f3\u30c9\u306e\u30d2\u30b9\u30c8\u30ea\u304b\u3089\u62bd\u51fa\u3059\u308c\u3070\u826f\u3044\u306e\u304b\u306a\u3068\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u3069\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3067\u3069\u306e\u304f\u3089\u3044\u30ea\u30bd\u30fc\u30b9\u3092\u4f7f\u3046\u4ed5\u4e8b\u3092\u3057\u305f\u3068\u304b\u3001\u305d\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3067\u306e\u30a2\u30af\u30c6\u30a3\u30d6\u306a\u6ede\u5728\u6642\u9593\u304c\u308f\u304b\u308b\u3068\u826f\u3044\u3067\u3059\u306d\u3002\u307e\u3042\u305d\u308c\u3082\u3001\u30b3\u30de\u30f3\u30c9\u306e\u30d2\u30b9\u30c8\u30ea\u30fc\u306e\u307b\u3046\u304b\u3089\u96c6\u8a08\u3059\u308c\u3070\u826f\u3044\u306e\u304b\u3082\u77e5\u308c\u307e\u305b\u3093\u304c\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3042\u3068\u3001\u30d2\u30b9\u30c8\u30ea\u306e\u4f55\u756a\u304b\u3089\u4f55\u756a\u307e\u3067\u3092\u518d\u5b9f\u884c\u3057\u305f\u3044\u3068\u304b\u3001\u4e00\u3064\u306e\u30b3\u30de\u30f3\u30c9\u5217\u3068\u3057\u3066\u767b\u9332\u3067\u304d\u308b\u3088\u3046\u306b\u306a\u3063\u3066\u308b\u3068\u826f\u3044\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u305f\u3060\u3001\u9577\u5927\u306a\u30b3\u30de\u30f3\u30c9\u30d2\u30b9\u30c8\u30ea\u3092\u63a2\u3057\u305f\u308a\u7de8\u96c6\u3057\u305f\u308a\u3092\u30e9\u30a4\u30f3\u30a8\u30c7\u30a3\u30bf\u3067\u3084\u308b\u306e\u306f\u3069\u3046\u304b\u3068\u601d\u3044\u307e\u3059\u3002\u306a\u306e\u3067\u3001\u305d\u3046\u3044\u3046\u4f5c\u696d\u306f\u3053\u306egshell\u3092HTTP\u30b5\u30fc\u30d0\u306b\u3057\u3066\u3001HTTP\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u3068\u3044\u3046\u304b\u30d6\u30e9\u30a6\u30b6\u304b\u3089\u3084\u308c\u3070\u3088\u3044\u306e\u304b\u306a\u3068\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3042\u3068\u3053\u308c\u306f\u5404\u30b3\u30de\u30f3\u30c9\u306e\u51fa\u529b\u3082\u5f8c\u304b\u3089\u8aad\u3081\u308b\u3088\u3046\u306b\u3057\u305f\u3044\u3067\u3059\u3002\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u3001\u30b3\u30de\u30f3\u30c9\u5358\u4f4d\u3067sciript\u30b3\u30de\u30f3\u30c9\u304c\u52d5\u3044\u3066\u3044\u308b\u307f\u305f\u3044\u306a\u3002\u3067\u3001\u305d\u308c\u3092\u95b2\u89a7\u3059\u308b\u306e\u3082\u3084\u306f\u308a\u3001\u30d6\u30e9\u30a6\u30b6\u304c\u9069\u3057\u3066\u3044\u305d\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u30ea\u30e2\u30fc\u30c8\u306b\u30ed\u30b0\u30a4\u30f3\u3057\u305f\u72b6\u614b\u3067\u305d\u308c\u3092\u3084\u308b\u306b\u306f\u3001\u30ea\u30e2\u30fc\u30c8\u306egshell\u30b5\u30fc\u30d0\u306b\u7e4b\u304c\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u3067\u3059\u304c\u3001\u30ed\u30fc\u30ab\u30eb\u306a\u51fa\u5411\u5143\u306eshell\u306e\u53e3\u304b\u3089\u9023\u7d61\u3057\u305f\u3044\u3067\u3059\u3088\u306d\u3002\u305d\u3046\u3044\u3046\u610f\u5473\u3067\u3082\u3001\u30ea\u30e2\u30fc\u30c8\u30b7\u30a7\u30eb\u6a5f\u80fd\u306f\u5185\u8535\u3057\u3066\u3044\u306a\u3044\u3068\u3044\u3051\u306a\u3044\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u305d\u3046\u3067\u3059\u306d\u3002\u6b21\u306e\u4e3b\u984c\u306f\u3053\u306egshell\u3092\u7c21\u5358\u306aHTTP\u30b5\u30fc\u30d0\u306b\u3059\u308b\u3053\u3068\u3060\u3068\u601d\u3063\u3066\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u30d2\u30b9\u30c8\u30ea\u306e\u4e2d\u304b\u3089\u30b3\u30d4\u30da\u3063\u3066\u3044\u3046\u306e\u3082\u3084\u308a\u307e\u3059\u3088\u306d\u3002\u30b3\u30de\u30f3\u30c9\u756a\u53f7\u304c\u90aa\u9b54\u3060\u3068\u601d\u3063\u3066\u3044\u305f\u306e\u3067\u3059\u304c\u3001<a href=\"https:\/\/www.computerhope.com\/unix\/uhistory.htm\">fc -ln \u306a\u3093\u3066\u3044\u3046\u30b3\u30de\u30f3\u30c9\u30fb\u30aa\u30d7\u30b7\u30e7\u30f3<\/a>\u304c\u3042\u308b\u6a21\u69d8\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a!3-5 \u3067 !3;!4;!5 \u3092\u3067\u304d\u3061\u3083\u3046\u3068\u826f\u3044\u304b\u3082\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u3068\u3053\u308d\u3067\u300c\u518d\u5b9f\u884c\u300d\u306f\u4f1d\u7d71\u7684\u306b\uff01\u3067\u3059\u304c\u3001\uff1f\u3092\u30d2\u30b9\u30c8\u30ea\u3068\u304b\u306e\u691c\u7d22\u6a5f\u80fd\u306b\u5272\u308a\u5f53\u3066\u308b\u3068\u826f\u3044\u3088\u3046\u306b\u3082\u601d\u3046\u306e\u3067\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\uff1f\u306f\u30d5\u30a1\u30a4\u30eb\u540d\u306e1\u6587\u5b57\u306e\u30de\u30c3\u30c1\u30f3\u30b0\u306b\u4f7f\u308f\u308c\u3066\u3057\u307e\u3063\u3066\u307e\u3059\u304b\u3089\u306d\u3047\u2026\u3000\u3067\u3082\u307e\u3042\u3001\u884c\u982d\u306e\uff1f\u3060\u3051\u306f\u5225\u6271\u3044\u3067\u3082\u826f\u3044\u304b\u3082\u3057\u307e\u305b\u3093\u3002\u3075\u3064\u3046\u306b\uff1f\u3068\u3057\u3066\u4f7f\u3044\u305f\u304b\u3063\u305f\u3089\u3001.\/?\u3068\u304b\u3059\u308c\u3070\u826f\u3055\u3069\u3046\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u3064\u307e\u308a\uff1f\u304chistory\u30b3\u30de\u30f3\u30c9\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u306d\u3002?3\u3068\u304b\u3059\u308b\u3068\u3001\u30d2\u30b9\u30c8\u30ea\u306e3\u756a\u76ee\u306e\u30b3\u30de\u30f3\u30c9\u3092\u30e9\u30a4\u30f3\u30a8\u30c7\u30a3\u30bf\u306b\u547c\u3073\u51fa\u3059\u3068\u304b\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304c\u30bf\u30d6\u3067\u30b3\u30f3\u30d7\u30ea\u30fc\u30b7\u30e7\u30f3\u3067\u304d\u308b\u3068\u826f\u3044\u3067\u3059\u306d\u3002\u3068\u3044\u3046\u304b\u3001\u3053\u306e\u3078\u3093\u306f\u304b\u306a\u6f22\u5b57\u5909\u63db\u306e\u30b7\u30f3\u30d7\u30eb\u7248\u307f\u305f\u3044\u306a\u3082\u306e\u3067\u3059\u304b\u3089\u3001\u5b9f\u969b\u304b\u306a\u6f22\u5b57\u5909\u63db\u3068\u540c\u3058\u30ad\u30fc\u30d0\u30a4\u30f3\u30c7\u30a3\u30f3\u30b0\u3067\u691c\u7d22\u3059\u308c\u3070\u3088\u3044\u306e\u304b\u306a\u3068\u601d\u3044\u307e\u3059\u304c\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u3044\u3063\u305dIME\u3082\u4f5c\u3063\u3061\u3083\u3044\u305f\u3044\u3067\u3059\u306d\u3002\u30ed\u30fc\u30de\u5b57\u304b\u306a\u5909\u63db\u307e\u3067\u306a\u3089\u3001\u7c21\u5358\u306a\u30d7\u30ed\u30b0\u30e9\u30e0\u3067\u51fa\u6765\u308b\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3042\u3068\u3001gshell \u81ea\u4f53\u304c\u691c\u7d22\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u3068\u304b\u3001\u306b\u5bfe\u3057\u3066\u306f\u3001find \u306e -ls \u7684\u306b\u8868\u793a\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u305f\u3044\u3068\u601d\u3063\u3066\u3044\u307e\u3059\u3002\u307e\u305a\u306fwhich\u3067\u3084\u3063\u3066\u307f\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"476\" height=\"224\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-18.22.58.png\" alt=\"\" class=\"wp-image-13606\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-18.22.58.png 476w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-18.22.58-300x141.png 300w\" sizes=\"(max-width: 476px) 100vw, 476px\" \/><\/figure>\n\n\n\n<p>\u57fa\u76e4\uff1ashared library \u3067\u3082\u540c\u3058\u3088\u3046\u306b\u3067\u304d\u308b\u3067\u3057\u3087\u3046\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3042\u3042\u3001\u3042\u3068 chdir \u306e\u30d2\u30b9\u30c8\u30ea\u3082\u540c\u69d8\u3067\u3059\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"589\" height=\"296\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-18.37.09.png\" alt=\"\" class=\"wp-image-13611\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-18.37.09.png 589w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-18.37.09-300x151.png 300w\" sizes=\"(max-width: 589px) 100vw, 589px\" \/><\/figure>\n\n\n\n<p>\u958b\u767a\uff1a\u305d\u308c\u3068\u304b\u3001\u7a7a\u767d\u3092\u542b\u3080\u5f15\u6570\u3001\u7279\u306b\u30d5\u30a1\u30a4\u30eb\u540d\u3067\u3059\u304c\u3001\u3092\u4f7f\u3046\u305f\u3081\u306b\u3044\u3061\u3044\u3061\u30af\u30aa\u30fc\u30c8\u3067\u3084\u308b\u306e\u304c\u3059\u3054\u304f\u5acc\u3067\u3059\u3002\u306a\u306e\u3067\u3001\u00a5s \u3092\u7a7a\u767d\u3068\u89e3\u91c8\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3057\u305f\u3002<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" width=\"482\" height=\"174\" src=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-18.31.35.png\" alt=\"\" class=\"wp-image-13609\" srcset=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-18.31.35.png 482w, https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/Screen-Shot-2020-08-10-at-18.31.35-300x108.png 300w\" sizes=\"(max-width: 482px) 100vw, 482px\" \/><\/figure>\n\n\n\n<p>\u793e\u9577\uff1a\u7a7a\u767d\u3092\u00a5s\u3067\u8868\u73fe\u3059\u308b\u306e\u306fDeleGate\u3067\u3082\u3084\u3063\u3066\u307e\u3057\u305f\u3002\u306a\u3093\u3067\u6a19\u6e96\u7684\u306b\u5b58\u5728\u3057\u3066\u306a\u3044\u3093\u3067\u3059\u304b\u306d\uff1f<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3055\u3042\u3002\u4f55\u306b\u3057\u3066\u3082\u3053\u308c\u306f\u500b\u4eba\u306e\u624b\u5143\u3067\u4f7f\u3046\u8868\u8a18\u3067\u3059\u304b\u3089\u3001\u3084\u308a\u305f\u3044\u3088\u3046\u306b\u3084\u308c\u3070\u826f\u3044\u304b\u306a\u3068\u601d\u3044\u307e\u3059\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1awhich\u3067\u3084\u308b\u6307\u5b9a\u3055\u308c\u305fPATH\u306e\u691c\u7d22\u3068find\u306f\u5144\u5f1f\u307f\u305f\u3044\u306a\u3082\u306e\u3060\u3057\u3001ls\u306f find -ls \u306e\u7c21\u7565\u7248\u307f\u305f\u3044\u3082\u306e\u3060\u3068\u601d\u3044\u307e\u3059\u3002PATH\u306e\u4e2d\u3067\u30d5\u30a1\u30a4\u30eb\u3092\u30ef\u30a4\u30eb\u30c9\u30ab\u30fc\u30c9\u3067\u691c\u7d22\u3059\u308b\u6a5f\u80fd\u306f\u3082\u3068\u3082\u3068\u52d5\u7684\u30e9\u30a4\u30d6\u30e9\u30ea\u306e\u305f\u3081\u306b\u5b58\u5728\u3057\u307e\u3059\u304b\u3089\u3001\u305d\u308c\u3092\u30e6\u30fc\u30b6\u304c\u30b3\u30de\u30f3\u30c9\u3068\u3057\u3066\u3001\u3042\u308b\u3044\u306f\u5f15\u6570\u306e\u30ef\u30a4\u30eb\u30c9\u30ab\u30fc\u30c9\u3068\u3057\u3066\u4f7f\u3048\u308b\u3088\u3046\u306b\u3059\u308b\u3068\u826f\u3044\u3068\u601d\u3044\u307e\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1aPATH\u3092\u3044\u3061\u3044\u3061\u5b9a\u7fa9\u3059\u308b\u306e\u306f\u9762\u5012\u3060\u3063\u305f\u308a\u3059\u308b\u306e\u3067\u3001\u3053\u308c\u307e\u3067\u306b\u6ede\u5728\u3057\u305f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u52d5\u7684\u306bPATH\u3068\u3057\u3066\u4f7f\u3048\u308c\u3070\u826f\u3044\u3067\u3059\u306d\u3002\u3042\u308b\u3044\u306f\u3001\u3053\u308c\u307e\u3067\u30d7\u30ed\u30b0\u30e9\u30e0\u306b\u6e21\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u540d\u3068\u601d\u3057\u304d\u5f15\u6570\u306e\u4e2d\u304b\u3089\u691c\u7d22\u3055\u305b\u308b\u3001\u3068\u3044\u3046\u304b\u30aa\u30fc\u30c8\u30b3\u30f3\u30d7\u30ea\u30fc\u30b7\u30e7\u30f3\u3055\u305b\u308b\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u306e\u9ece\u660e\u671f\u306b\u306f\u30d2\u30b9\u30c8\u30ea\u6a5f\u80fd\u3068\u3044\u3046\u306e\u306f\u30ea\u30bd\u30fc\u30b9\u3092\u98df\u3046\u8d05\u6ca2\u6a5f\u80fd\u3060\u3063\u305f\u308f\u3051\u3067\u3059\u3002\u500b\u4eba\u304c\u4f7f\u3048\u308b\u30c7\u30a3\u30b9\u30af\u5bb9\u91cf\u304c1\u30e1\u30ac\u3082\u7121\u3044\u6642\u4ee3\u3002\u30b3\u30de\u30f3\u30c9\u30b7\u30a7\u30eb\u3063\u3066\u3001\u305d\u3046\u3044\u3046\u6642\u4ee3\u306e\u932f\u8aa4\u3092\u5f15\u304d\u305a\u3063\u3066\u308b\u6c17\u304c\u3057\u307e\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u57fa\u76e4\uff1a\u307e\u3042\u3001\u30d2\u30b9\u30c8\u30ea\u306b1\u30ae\u30ac\u4f7f\u3063\u3066\u3082\u306a\u3093\u306e\u3053\u3068\u306f\u306a\u3044\u3067\u3059\u3088\u306d\u3002\u30d9\u30bf\u691c\u7d22\u3057\u305f\u3063\u3066\u6570\u79d2\u3082\u304b\u304b\u3089\u306a\u3044\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u306a\u306e\u3067\u3053\u306e\u5148\u306f\u305a\u3063\u3068\u305d\u3046\u3044\u3046\u5f62\u3067\u30d2\u30b9\u30c8\u30ea\u3092\u4fdd\u5b58\u3057\u3066\u3001\u3042\u304210\u5e74\u524d\u3053\u306e\u6642\u306b\u306f\u3053\u3093\u306a\u30b3\u30de\u30f3\u30c9\u3092\u6253\u3063\u3066\u305f\u306a\u307f\u305f\u3044\u306a\u601d\u3044\u51fa\u306b\u3072\u305f\u3063\u305f\u308a\u3059\u308b\u308f\u3051\u3067\u3059\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u30d2\u30b9\u30c8\u30ea\u306e\u691c\u7d22\u3092\u3057\u3084\u3059\u304f\u3059\u308b\u305f\u3081\u306b\u306f\u3001\u30e6\u30fc\u30b6\u304c\u660e\u793a\u7684\u306b\u30e9\u30d9\u30eb\u3068\u8a00\u3046\u304b\u30bf\u30b0\u3092\u4ed8\u3051\u305f\u3044\u3067\u3059\u306d\u3002\u3068\u3044\u3046\u304b\u3001\u30d2\u30b9\u30c8\u30ea\u3092HTTP\u3067\u3001HTML\u3067\u773a\u3081\u308b\u3068\u3044\u3046\u5168\u4f53\u306a\u3089\u3001\u30ed\u30b0\u30a4\u30f3\u3054\u3068\u306b\u30bf\u30a4\u30c8\u30eb\u3068\u304b\u30b5\u30d6\u30bf\u30a4\u30c8\u30eb\u3092\u4ed8\u3051\u308b\u5fc5\u8981\u306f\u3042\u308b\u306e\u304b\u306a\u3068\u601d\u3044\u307e\u3059\u3002\u30d6\u30c3\u30af\u30de\u30fc\u30af\u3068\u3044\u3044\u3044\u307e\u3059\u304b\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u30b9\u30af\u30ea\u30d7\u30c8\u306b\u30b3\u30e1\u30f3\u30c8\u3092\u66f8\u304f\u3053\u3068\u306f\u591a\u3044\u3067\u3059\u304c\u3001\u30a4\u30f3\u30bf\u30e9\u30af\u30c6\u30a3\u30d6\u306b\u5165\u529b\u3057\u3066\u3044\u308b\u7aef\u672b\u3067\u30b3\u30e1\u30f3\u30c8\u3092\u66f8\u304f\u3068\u3044\u3046\u306e\u306f\u3001\u306a\u3093\u3060\u304b\u30b7\u30e5\u30fc\u30eb\u3067\u826f\u3044\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3067\u4eca\u6c17\u3065\u3044\u305f\u3093\u3067\u3059\u304c\u3001bash \u3067\u306f # \u4ee5\u964d\u3092\u30b3\u30e1\u30f3\u30c8\u3068\u3057\u3066\u7121\u8996\u3057\u3066\u304f\u308c\u307e\u3059\u304c\u3001zsh \u306f\u305d\u3046\u306a\u3063\u3066\u306a\u3044\u3093\u3067\u3059\u306d\u3002<\/p>\n\n\n\n<p>\u793e\u9577\uff1a\u5b9f\u88c5\u4e0a\u306e\u4f55\u304b\u56f0\u96e3\u306f\uff1f<\/p>\n\n\n\n<p>\u958b\u767a\uff1a\u3060\u3044\u3076Go\u306e\u66f8\u304d\u65b9\u3068\u3044\u3046\u304b\u3001\u30d1\u30c3\u30b1\u30fc\u30b8\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e\u6d41\u5100\u3068\u304b\u3001\u30b9\u30e9\u30a4\u30b9\u306e\u4f7f\u3044\u65b9\u304c\u308f\u304b\u3063\u3066\u6765\u305f\u306e\u3067\u30b9\u30e0\u30fc\u30ba\u306b\u306a\u308a\u307e\u3057\u305f\u3002\u305f\u3060\u4eca\u4f5c\u3063\u3066\u3044\u308b\u306e\u304c\u30b7\u30b9\u30c6\u30e0\u5bc4\u308a\u306e\u30b3\u30fc\u30c9\u306a\u306e\u3067\u3059\u304c\u3001os \u30d1\u30c3\u30b1\u30fc\u30b8\u304c\u975e\u529b\u3068\u3044\u3046\u304b\u672a\u719f\u306a\u306e\u304c\u3064\u3089\u3044\u3067\u3059\u304b\u306d\u3002syscall \u306b\u306a\u308b\u3053\u3068\u304c\u591a\u3044\u3067\u3059\u3002<\/p>\n\n\n\n<details><summary>gsh0.0.5<\/summary>\n\/\/<title>Gshell by SatoxITS<\/title><!-- script>code=document.getElementById(\"code\");document.documentElement.innerHTML=code;<\/script --><pre id=code style=\"font-family:Courier New;\">\n\/\/ gsh - Go lang based Shell\n\/\/ (c) 2020 ITS more Co., Ltd.\n\/\/ 2020-0807 created by SatoxITS (sato@its-more.jp)\n\/\/\npackage main \/\/ gsh main\n\/\/ Documents: https:\/\/golang.org\/pkg\/\nimport (\n\t\"bufio\"\n\t\"strings\"\n\t\"strconv\"\n\t\"sort\"\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\t\"syscall\"\n\t\"go\/types\"\n\t\"go\/token\"\n\t\"net\"\n)\n\nvar VERSION = \"gsh\/0.0.5 (2020-0810a)\"\nvar LINESIZE = (8*1024)\nvar PATHSEP = \":\" \/\/ should be \";\" in Windows\nvar DIRSEP = \"\/\" \/\/ canbe \\ in Windows\nvar PROMPT = \"> \"\nvar GSH_HOME = \".gsh\" \/\/ under home directory\n\ntype GCommandHistory struct {\n\tStartAt\t\ttime.Time\n\tEndAt\t\ttime.Time\n\tResCode\t\tint\n\tOutData\t\t*os.File\n\tCmdLine\t\tstring\n\tResCons\t\tint \/\/ Resource consumption, CPU time or so\n}\ntype GChdirHistory struct {\n\tDir\t\tstring\n\tMovedAt\t\ttime.Time\n}\ntype GshContext struct {\n\tStartDir\tstring\t\/\/ the current directory at the start\n\tGetLine\t\tstring\t\/\/ gsh-getline command as a input line editor\n\tChdirHistory\t[]GChdirHistory \/\/ the 1st entry is wd at the start\n\tgshPA\t\tsyscall.ProcAttr\n\tCommandHistory\t[]GCommandHistory\n\tBackGround\tbool\n\tBackGroundJobs\t[]int\n\tLastRusage\tsyscall.Rusage\n\tGshHomeDir\tstring\n\tTerminalId\tint\n}\n\nfunc isin(what string, list []string) bool {\n\tfor _, v := range list  {\n\t\tif v == what {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc env(opts []string) {\n\tenv := os.Environ()\n\tif isin(\"-s\", opts){\n\t\tsort.Slice(env, func(i,j int) bool {\n\t\t\treturn env[i] < env[j]\n\t\t})\n\t}\n\tfor _, v := range env {\n\t\tfmt.Printf(\"%v\\n\",v)\n\t}\n}\n\nfunc strsubst(str string) string {\n\trstr := \"\"\n\tinEsc := 0 \/\/ escape characer mode \n\tfor _, ch := range str {\n\t\tif inEsc == 0 {\n\t\t\tif ch == '\\\\' {\n\t\t\t\tinEsc = '\\\\'\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif inEsc == '\\\\' {\n\t\t\tif ch == 's' { ch = ' ' }\n\t\t\tif ch == 'r' { ch = '\\r' }\n\t\t\tif ch == 'n' { ch = '\\n' }\n\t\t\tif ch == 't' { ch = '\\t' }\n\t\t\tif ch == '\\\\' { ch = '\\\\' }\n\t\t\tinEsc = 0 \n\t\t}\n\t\trstr = rstr + string(ch)\n\t}\n\treturn rstr\n}\n\nfunc showFileInfo(path string, opts []string) {\n\tif isin(\"-ls\",opts) {\n\t\tfi, _ := os.Stat(path)\n\t\tmod := fi.ModTime()\n\t\tdate := mod.Format(time.Stamp)\n\t\tfmt.Printf(\"%v %8v %s \",fi.Mode(),fi.Size(),date)\n\t}\n\tfmt.Printf(\"%s\",path)\n\tif ! isin(\"-n\",opts) {\n\t\tfmt.Printf(\"\\n\")\n\t}\n}\n\nfunc toFullpath(path string) (fullpath string) {\n\tpathv := strings.Split(path,DIRSEP)\n\tif pathv[0] == \".\" {\n\t\tpathv[0], _ = os.Getwd()\n\t}else\n\tif pathv[0] == \"..\" {\n\t\tcwd, _ := os.Getwd()\n\t\tppathv := strings.Split(cwd,DIRSEP)\n\t\tpathv[0] = strings.Join(ppathv,DIRSEP)\n\t}else\n\tif pathv[0] == \"~\" {\n\t\tpathv[0],_ = os.UserHomeDir()\n\t}\n\treturn strings.Join(pathv,DIRSEP)\n}\n\nfunc which(list string, argv []string) (fullpathv []string, itis bool){\n\tif len(argv) <= 1 {\n\t\tfmt.Printf(\"Usage: which comand [-s] [-a] [-ls]\\n\")\n\t\treturn []string{\"\"}, false\n\t}\n\tpath := argv[1]\n\tpathenv, efound := os.LookupEnv(list)\n\tif ! efound {\n\t\tfmt.Printf(\"which: no \\\"%s\\\" environment\\n\",list)\n\t\treturn []string{\"\"}, false\n\t}\n\tdirv := strings.Split(pathenv,PATHSEP)\n\tffound := false\n\tffullpath := path\n\tfor _, dir := range dirv {\n\t\tfullpath := dir + DIRSEP + path\n\t\tfi, err := os.Stat(fullpath)\n\t\tif err != nil {\n\t\t\tfullpath = dir + DIRSEP + path + \".go\"\n\t\t\tfi, err = os.Stat(fullpath)\n\t\t}\n\t\tif err == nil {\n\t\t\tfm := fi.Mode()\n\t\t\tif fm.IsRegular() {\n\t\t\t\tffullpath = fullpath\n\t\t\t\tffound = true\n\t\t\t\tif ! isin(\"-s\", argv) {\n\t\t\t\t\tshowFileInfo(fullpath,argv)\n\t\t\t\t}\n\t\t\t\tif ! isin(\"-a\", argv) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn []string{ffullpath}, ffound\n}\n\nfunc find(argv []string){\n}\n\nfunc eval(argv []string, nlend bool){\n\tvar ai = 1\n\tpfmt := \"%s\"\n\tif argv[ai][0:1] == \"%\" {\n\t\tpfmt = argv[ai]\n\t\tai = 2\n\t}\n\tif len(argv) <= ai {\n\t\treturn\n\t}\n\tgocode := strings.Join(argv[ai:],\" \");\n\tfset := token.NewFileSet()\n\trval, _ := types.Eval(fset,nil,token.NoPos,gocode)\n\tfmt.Printf(pfmt,rval.Value)\n\tif nlend { fmt.Printf(\"\\n\") }\n}\n\nfunc getval(name string) (found bool, val int) {\n\t\/* should expand the name here *\/\n\tif name == \"gsh.pid\" {\n\t\treturn true, os.Getpid()\n\t}else\n\tif name == \"gsh.ppid\" {\n\t\treturn true, os.Getppid()\n\t}\n\treturn false, 0\n}\n\nfunc echo(argv []string, nlend bool){\n\tfor ai := 1; ai < len(argv); ai++ {\n\t\tif 1 < ai {\n\t\t\tfmt.Printf(\" \");\n\t\t}\n\t\targ := argv[ai]\n\t\tfound, val := getval(arg)\n\t\tif found {\n\t\t\tfmt.Printf(\"%d\",val)\n\t\t}else{\n\t\t\tfmt.Printf(\"%s\",arg)\n\t\t}\n\t}\n\tif nlend {\n\t\tfmt.Printf(\"\\n\");\n\t}\n}\n\nfunc resfile() string {\n\treturn \"gsh.tmp\"\n}\n\/\/var resF *File\nfunc resmap() {\n\t\/\/_ , err := os.OpenFile(resfile(), os.O_RDWR|os.O_CREATE, os.ModeAppend)\n\t\/\/ https:\/\/developpaper.com\/solution-to-golang-bad-file-descriptor-problem\/\n\t_ , err := os.OpenFile(resfile(), os.O_RDWR|os.O_CREATE, 0600)\n\tif err != nil {\n\t\tfmt.Printf(\"refF could not open: %s\\n\",err)\n\t}else{\n\t\tfmt.Printf(\"refF opened\\n\")\n\t}\n}\n\nfunc excommand(gshCtx GshContext, exec bool, argv []string) (GshContext, bool) {\n\tgshPA := gshCtx.gshPA\n\tfullpathv, itis := which(\"PATH\",[]string{\"which\",argv[0],\"-s\"})\n\tif itis == false {\n\t\treturn gshCtx, true\n\t}\n\tfullpath := fullpathv[0]\n\tif 0 < strings.Index(fullpath,\".go\") {\n\t\tnargv := argv \/\/ []string{}\n\t\tgofullpathv, itis := which(\"PATH\",[]string{\"which\",\"go\",\"-s\"})\n\t\tif itis == false {\n\t\t\tfmt.Printf(\"--F-- Go not found\\n\")\n\t\t\treturn gshCtx, true\n\t\t}\n\t\tgofullpath := gofullpathv[0]\n\t\tnargv = []string{ gofullpath, \"run\", fullpath }\n\t\tfmt.Printf(\"--I-- %s {%s %s %s}\\n\",gofullpath,\n\t\t\tnargv[0],nargv[1],nargv[2])\n\t\tif exec {\n\t\t\tsyscall.Exec(gofullpath,nargv,os.Environ())\n\t\t}else{\n\t\t\tpid, _ := syscall.ForkExec(gofullpath,nargv,&gshPA)\n\t\t\tif gshCtx.BackGround {\n\t\t\t\tfmt.Printf(\"--I-- in Background [%d]\\n\",pid)\n\t\t\t\tgshCtx.BackGroundJobs = append(gshCtx.BackGroundJobs,pid)\n\t\t\t}else{\n\t\t\t\trusage := syscall.Rusage {}\n\t\t\t\tsyscall.Wait4(pid,nil,0,&rusage)\n\t\t\t\tgshCtx.LastRusage = rusage\n\t\t\t}\n\t\t}\n\t}else{\n\t\tif exec {\n\t\t\tsyscall.Exec(fullpath,argv,os.Environ())\n\t\t}else{\n\t\t\tpid, _ := syscall.ForkExec(fullpath,argv,&gshPA)\n\t\t\t\/\/fmt.Printf(\"[%d]\\n\",pid); \/\/ '&' to be background\n\t\t\tif gshCtx.BackGround {\n\t\t\t\tfmt.Printf(\"--I-- in Background [%d]\\n\",pid)\n\t\t\t\tgshCtx.BackGroundJobs = append(gshCtx.BackGroundJobs,pid)\n\t\t\t}else{\n\t\t\t\trusage := syscall.Rusage {}\n\t\t\t\tsyscall.Wait4(pid,nil,0,&rusage);\n\t\t\t\tgshCtx.LastRusage = rusage\n\t\t\t}\n\t\t}\n\t}\n\treturn gshCtx, false\n}\nfunc sleep(gshCtx GshContext, gshPA syscall.ProcAttr, argv []string) {\n\tif len(argv) < 2 {\n\t\tfmt.Printf(\"Sleep 100ms, 100us, 100ns, ...\\n\")\n\t\treturn\n\t}\n\tduration := argv[1];\n\td, err := time.ParseDuration(duration)\n\tif err != nil {\n\t\td, err = time.ParseDuration(duration+\"s\")\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"duration ? %s (%s)\\n\",duration,err)\n\t\t\treturn\n\t\t}\n\t}\n\tfmt.Printf(\"Sleep %v ns\\n\",duration)\n\ttime.Sleep(d)\n\tif 0 < len(argv[2:]) {\n\t\tgshellv(gshCtx, gshPA, argv[2:])\n\t}\n}\nfunc repeat(gshCtx GshContext, gshPA syscall.ProcAttr, argv []string) {\n\tif len(argv) < 2 {\n\t\treturn\n\t}\n\tstart0 := time.Now()\n\tfor ri,_ := strconv.Atoi(argv[1]); 0 < ri; ri-- {\n\t\tif 0 < len(argv[2:]) {\n\t\t\t\/\/start := time.Now()\n\t\t\tgshellv(gshCtx, gshPA, argv[2:])\n\t\t\tend := time.Now()\n\t\t\telps := end.Sub(start0);\n\t\t\tif( 1000000000 < elps ){\n\t\t\t\tfmt.Printf(\"(repeat#%d %v)\\n\",ri,elps);\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc gen(gshPA syscall.ProcAttr, argv []string) {\n\tif len(argv) < 2 {\n\t\tfmt.Printf(\"Usage: %s N\\n\",argv[0])\n\t\treturn\n\t}\n\t\/\/ should br repeated by \"repeat\" command\n\tcount, _ := strconv.Atoi(argv[1])\n\tfd := gshPA.Files[1] \/\/ Stdout\n\tfile := os.NewFile(fd,\"internalStdOut\")\n\tfmt.Printf(\"--I-- Gen. Count=%d to [%d]\\n\",count,file.Fd())\n\t\/\/buf := []byte{}\n\toutdata := \"0123 5678 0123 5678 0123 5678 0123 5678\\r\"\n\tfor gi := 0; gi < count; gi++ {\n\t\tfile.WriteString(outdata)\n\t}\n\t\/\/file.WriteString(\"\\n\")\n\tfmt.Printf(\"\\n(%d B)\\n\",count*len(outdata));\n\t\/\/file.Close()\n}\n\n\/\/ -s, -si, -so \/\/ bi-directional, source, sync (maybe socket)\nfunc sconnect(gshCtx GshContext, gshPA syscall.ProcAttr, inTCP bool, argv []string) {\n\tif len(argv) < 2 {\n\t\tfmt.Printf(\"Usage: -s [host]:[port[.udp]]\\n\")\n\t\treturn\n\t}\n\tremote := argv[1]\n\tif remote == \":\" { remote = \"0.0.0.0:9999\" }\n\n\tif inTCP { \/\/ TCP\n\t\tdport, err := net.ResolveTCPAddr(\"tcp\",remote);\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Address error: %s (%s)\\n\",remote,err)\n\t\t\treturn\n\t\t}\n\t\tconn, err := net.DialTCP(\"tcp\",nil,dport)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Connection error: %s (%s)\\n\",remote,err)\n\t\t\treturn\n\t\t}\n\t\tfile, _ := conn.File();\n\t\tfd := file.Fd()\n\t\tfmt.Printf(\"Socket: connected to %s, socket[%d]\\n\",remote,fd)\n\n\t\tsavfd := gshPA.Files[1]\n\t\tgshPA.Files[1] = fd;\n\t\tgshellv(gshCtx, gshPA, argv[2:])\n\t\tgshPA.Files[1] = savfd\n\t\tfile.Close()\n\t\tconn.Close()\n\t}else{\n\t\t\/\/dport, err := net.ResolveUDPAddr(\"udp4\",remote);\n\t\tdport, err := net.ResolveUDPAddr(\"udp\",remote);\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Address error: %s (%s)\\n\",remote,err)\n\t\t\treturn\n\t\t}\n\t\t\/\/conn, err := net.DialUDP(\"udp4\",nil,dport)\n\t\tconn, err := net.DialUDP(\"udp\",nil,dport)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Connection error: %s (%s)\\n\",remote,err)\n\t\t\treturn\n\t\t}\n\t\tfile, _ := conn.File();\n\t\tfd := file.Fd()\n\n\t\tar := conn.RemoteAddr()\n\t\t\/\/al := conn.LocalAddr()\n\t\tfmt.Printf(\"Socket: connected to %s [%s], socket[%d]\\n\",\n\t\t\tremote,ar.String(),fd)\n\n\t\tsavfd := gshPA.Files[1]\n\t\tgshPA.Files[1] = fd;\n\t\tgshellv(gshCtx, gshPA, argv[2:])\n\t\tgshPA.Files[1] = savfd\n\t\tfile.Close()\n\t\tconn.Close()\n\t}\n}\nfunc saccept(gshCtx GshContext, gshPA syscall.ProcAttr, inTCP bool, argv []string) {\n\tif len(argv) < 2 {\n\t\tfmt.Printf(\"Usage: -ac [host]:[port[.udp]]\\n\")\n\t\treturn\n\t}\n\tlocal := argv[1]\n\tif local == \":\" { local = \"0.0.0.0:9999\" }\n\tif inTCP { \/\/ TCP\n\t\tport, err := net.ResolveTCPAddr(\"tcp\",local);\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Address error: %s (%s)\\n\",local,err)\n\t\t\treturn\n\t\t}\n\t\t\/\/fmt.Printf(\"Listen at %s...\\n\",local);\n\t\tsconn, err := net.ListenTCP(\"tcp\", port)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Listen error: %s (%s)\\n\",local,err)\n\t\t\treturn\n\t\t}\n\t\t\/\/fmt.Printf(\"Accepting at %s...\\n\",local);\n\t\taconn, err := sconn.AcceptTCP()\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Accept error: %s (%s)\\n\",local,err)\n\t\t\treturn\n\t\t}\n\t\tfile, _ := aconn.File()\n\t\tfd := file.Fd()\n\t\tfmt.Printf(\"Accepted TCP at %s [%d]\\n\",local,fd)\n\n\t\tsavfd := gshPA.Files[0]\n\t\tgshPA.Files[0] = fd;\n\t\tgshellv(gshCtx, gshPA, argv[2:])\n\t\tgshPA.Files[0] = savfd\n\n\t\tsconn.Close();\n\t\taconn.Close();\n\t\tfile.Close();\n\t}else{\n\t\t\/\/port, err := net.ResolveUDPAddr(\"udp4\",local);\n\t\tport, err := net.ResolveUDPAddr(\"udp\",local);\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Address error: %s (%s)\\n\",local,err)\n\t\t\treturn\n\t\t}\n\t\tfmt.Printf(\"Listen UDP at %s...\\n\",local);\n\t\t\/\/uconn, err := net.ListenUDP(\"udp4\", port)\n\t\tuconn, err := net.ListenUDP(\"udp\", port)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Listen error: %s (%s)\\n\",local,err)\n\t\t\treturn\n\t\t}\n\t\tfile, _ := uconn.File()\n\t\tfd := file.Fd()\n\t\tar := uconn.RemoteAddr()\n\t\tremote := \"\"\n\t\tif ar != nil { remote = ar.String() }\n\t\tif remote == \"\" { remote = \"?\" }\n\n\t\t\/\/ not yet received\n\t\t\/\/fmt.Printf(\"Accepted at %s [%d] <- %s\\n\",local,fd,\"\")\n\n\t\tsavfd := gshPA.Files[0]\n\t\tgshPA.Files[0] = fd;\n\t\tsavenv := gshPA.Env\n\t\tgshPA.Env = append(savenv, \"REMOTE_HOST=\"+remote)\n\t\tgshellv(gshCtx, gshPA, argv[2:])\n\t\tgshPA.Env = savenv\n\t\tgshPA.Files[0] = savfd\n\n\t\tuconn.Close();\n\t\tfile.Close();\n\t}\n}\n\n\/\/ empty line command\nfunc pwd(gshPA syscall.ProcAttr){\n\t\/\/ execute context command, pwd + date\n\t\/\/ context notation, representation scheme, to be resumed at re-login\n\tcwd, _ := os.Getwd()\n\tt := time.Now()\n\tdate := t.Format(time.UnixDate)\n\texe, _ := os.Executable()\n\thost, _ := os.Hostname()\n\tfmt.Printf(\"{PWD=\\\"%s\\\"\",cwd)\n\tfmt.Printf(\" HOST=\\\"%s\\\"\",host)\n\tfmt.Printf(\" DATE=\\\"%s\\\"\",date)\n\tfmt.Printf(\" TIME=\\\"%s\\\"\",t.String())\n\tfmt.Printf(\" PID=\\\"%d\\\"\",os.Getpid())\n\tfmt.Printf(\" EXE=\\\"%s\\\"\",exe)\n\tfmt.Printf(\"}\\n\")\n}\n\n\/\/ these should be browsed and edited by HTTP browser\n\/\/ show the time of command with -t and direcotry with -ls\n\/\/ openfile-history, sort by -a -m -c\n\/\/ sort by elapsed time by -t -s\n\/\/ search by \"more\" like interface\n\/\/ edit history\n\/\/ sort history, and wc or uniq\n\/\/ CPU and other resource consumptions\n\/\/ limit showing range (by time or so)\n\/\/ export \/ import history\nfunc xHistory(gshCtx GshContext, argv []string) (rgshCtx GshContext) {\n\tfor i, v := range gshCtx.CommandHistory {\n\t\tfmt.Printf(\"!%d \",i)\n\t\tif isin(\"-v\",argv){\n\t\t\tfmt.Println(v) \/\/ should be with it date\n\t\t}else{\n\t\t\tif isin(\"-l\",argv){\n\t\t\t\telps := v.EndAt.Sub(v.StartAt);\n\t\t\t\tstart := v.StartAt.Format(time.Stamp)\n\t\t\t\tfmt.Printf(\"%s (%8v) \",start,elps)\n\t\t\t}\n\t\t\tfmt.Printf(\"%s\",v.CmdLine)\n\t\t\tfmt.Printf(\"\\n\")\n\t\t}\n\t}\n\treturn gshCtx\n}\n\/\/ !n - history index\nfunc searchHistory(gshCtx GshContext, gline string) (string, bool, bool){\n\tif gline[0] == '!' {\n\t\thix, err := strconv.Atoi(gline[1:])\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"--E-- (%s : range)\\n\",hix)\n\t\t\treturn \"\", false, true\n\t\t}\n\t\tif hix < 0 || len(gshCtx.CommandHistory) <= hix {\n\t\t\tfmt.Printf(\"--E-- (%d : out of range)\\n\",hix)\n\t\t\treturn \"\", false, true\n\t\t}\n\t\treturn gshCtx.CommandHistory[hix].CmdLine, false, false\n\t}\n\t\/\/ search\n\t\/\/for i, v := range gshCtx.CommandHistory {\n\t\/\/}\n\treturn gline, false, false\n}\n\n\/\/ temporary adding to PATH environment\n\/\/ cd name -lib for LD_LIBRARY_PATH\n\/\/ chdir with directory history (date + full-path)\n\/\/ -s for sort option (by visit date or so)\nfunc xChdirHistory(gshCtx GshContext, argv []string){\n\tfor i, v := range gshCtx.ChdirHistory {\n\t\tfmt.Printf(\"!%d \",i)\n\t\tfmt.Printf(\"%v \",v.MovedAt.Format(time.Stamp))\n\t\tshowFileInfo(v.Dir,argv)\n\t}\n}\nfunc xChdir(gshCtx GshContext, argv []string) (rgshCtx GshContext) {\n\tcdhist := gshCtx.ChdirHistory\n\tif isin(\"?\",argv ) || isin(\"-t\",argv) {\n\t\txChdirHistory(gshCtx,argv)\n\t\treturn gshCtx\n\t}\n\tpwd, _ := os.Getwd()\n\tdir := \"\"\n\tif len(argv) <= 1 {\n\t\tdir = toFullpath(\"~\")\n\t}else{\n\t\tdir = argv[1]\n\t}\n\tif dir[0] == '!' {\n\t\tif dir == \"!0\" {\n\t\t\tdir = gshCtx.StartDir\n\t\t}else\n\t\tif dir == \"!!\" {\n\t\t\tindex := len(cdhist) - 1\n\t\t\tif 0 < index { index -= 1 }\n\t\t\tdir = cdhist[index].Dir\n\t\t}else{\n\t\t\tindex, err := strconv.Atoi(dir[1:])\n\t\t\tif err != nil {\n\t\t\t\tfmt.Printf(\"--E-- xChdir(%v)\\n\",err)\n\t\t\t\tdir = \"?\"\n\t\t\t}else\n\t\t\tif len(gshCtx.ChdirHistory) <= index {\n\t\t\t\tfmt.Printf(\"--E-- xChdir(history range error)\\n\")\n\t\t\t\tdir = \"?\"\n\t\t\t}else{\n\t\t\t\tdir = cdhist[index].Dir\n\t\t\t}\n\t\t}\n\t}\n\tif dir != \"?\" {\n\t\terr := os.Chdir(dir)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"--E-- xChdir(%s)(%v)\\n\",argv[1],err)\n\t\t}else{\n\t\t\tcwd, _ := os.Getwd()\n\t\t\tif cwd != pwd {\n\t\t\t\thist1 := GChdirHistory { }\n\t\t\t\thist1.Dir = cwd\n\t\t\t\thist1.MovedAt = time.Now()\n\t\t\t\tgshCtx.ChdirHistory = append(cdhist,hist1)\n\t\t\t}\n\t\t}\n\t}\n\treturn gshCtx\n}\nfunc showRusage(what string,argv []string, ru *syscall.Rusage){\n\tfmt.Printf(\"%s: \",what);\n\tfmt.Printf(\"Usr=%d.%06ds\",ru.Utime.Sec,ru.Utime.Usec)\n\tfmt.Printf(\" Sys=%d.%06ds\",ru.Stime.Sec,ru.Stime.Usec)\n\tfmt.Printf(\" Rss=%vB\",ru.Maxrss)\n\tif isin(\"-l\",argv) {\n\t\tfmt.Printf(\" MinFlt=%v\",ru.Minflt)\n\t\tfmt.Printf(\" MajFlt=%v\",ru.Majflt)\n\t\tfmt.Printf(\" IxRSS=%vB\",ru.Ixrss)\n\t\tfmt.Printf(\" IdRSS=%vB\",ru.Idrss)\n\t\tfmt.Printf(\" Nswap=%vB\",ru.Nswap)\n\tfmt.Printf(\" Read=%v\",ru.Inblock)\n\tfmt.Printf(\" Write=%v\",ru.Oublock)\n\t}\n\tfmt.Printf(\" Snd=%v\",ru.Msgsnd)\n\tfmt.Printf(\" Rcv=%v\",ru.Msgrcv)\n\t\/\/if isin(\"-l\",argv) {\n\t\tfmt.Printf(\" Sig=%v\",ru.Nsignals)\n\t\/\/}\n\tfmt.Printf(\"\\n\");\n}\nfunc xTime(gshCtx GshContext, argv []string) (GshContext,bool) {\n\tif 2 <= len(argv){\n\t\txgshCtx, fin := gshellv(gshCtx,gshCtx.gshPA,argv[1:])\n\t\tgshCtx = xgshCtx\n\t\tshowRusage(argv[1],argv,&gshCtx.LastRusage)\n\t\treturn gshCtx, fin\n\t}else{\n\t\trusage:= syscall.Rusage {}\n\t\tsyscall.Getrusage(syscall.RUSAGE_SELF,&rusage)\n\t\tshowRusage(\"self\",argv, &rusage)\n\t\tsyscall.Getrusage(syscall.RUSAGE_CHILDREN,&rusage)\n\t\tshowRusage(\"child\",argv, &rusage)\n\t\treturn gshCtx, false\n\t}\n}\nfunc xJobs(gshCtx GshContext, argv []string){\n\tfmt.Printf(\"%d Jobs\\n\",len(gshCtx.BackGroundJobs))\n\tfor ji, pid := range gshCtx.BackGroundJobs {\n\t\t\/\/wstat := syscall.WaitStatus {0}\n\t\trusage := syscall.Rusage {}\n\t\t\/\/wpid, err := syscall.Wait4(pid,&wstat,syscall.WNOHANG,&rusage);\n\t\twpid, err := syscall.Wait4(pid,nil,syscall.WNOHANG,&rusage);\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"--E-- %%%d [%d] (%v)\\n\",ji,pid,err)\n\t\t}else{\n\t\t\t\tfmt.Printf(\"%%%d[%d](%d)\\n\",ji,pid,wpid)\n\t\t\tshowRusage(\"chld\",argv,&rusage)\n\t\t}\n\t}\n}\n\nfunc gshellv(gshCtx GshContext, gshPA syscall.ProcAttr, argv []string) (xx GshContext, fin bool) {\n\t\/\/fmt.Printf(\"--I-- gshellv((%d))\\n\",len(argv))\n\tif len(argv) <= 0 {\n\t\treturn gshCtx, false\n\t}\n\tfor ai := 0; ai < len(argv); ai++ {\n\t\targv[ai] = strsubst(argv[ai])\n\t}\n\tif false {\n\t\tfor ai := 0; ai < len(argv); ai++ {\n\t\t\tfmt.Printf(\"[%d] %s [%d]%T\\n\",\n\t\t\t\tai,argv[ai],len(argv[ai]),argv[ai])\n\t\t}\n\t}\n\tcmd := argv[0]\n\tif cmd == \"-ot\" {\n\t\tsconnect(gshCtx, gshPA, true, argv)\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"-ou\" {\n\t\tsconnect(gshCtx, gshPA, false, argv)\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"-it\" {\n\t\tsaccept(gshCtx, gshPA, true , argv)\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"-iu\" {\n\t\tsaccept(gshCtx, gshPA, false, argv)\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"-i\" || cmd == \"-o\" || cmd == \"-a\" || cmd == \"-s\" {\n\t\tif len(argv) < 2 {\n\t\t\treturn gshCtx, false\n\t\t}\n\t\tfdix := 0;\n\t\tmode := os.O_RDONLY;\n\t\tif cmd == \"-i\" {\n\t\t}\n\t\tif cmd == \"-o\" {\n\t\t\tfdix = 1;\n\t\t\tmode = os.O_RDWR | os.O_CREATE;\n\t\t}\n\t\tif cmd == \"-a\" {\n\t\t\tfdix = 1;\n\t\t\tmode = os.O_RDWR | os.O_CREATE | os.O_APPEND;\n\t\t}\n\t\tf, err := os.OpenFile(argv[1], mode, 0600)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"%s\\n\",err)\n\t\t\treturn gshCtx, false\n\t\t}\n\t\tsavfd := gshPA.Files[fdix]\n\t\tgshPA.Files[fdix] = f.Fd()\n\t\tfmt.Printf(\"--I-- Opened [%d] %s\\n\",f.Fd(),argv[1])\n\t\tgshCtx, _ = gshellv(gshCtx, gshPA, argv[2:])\n\t\tgshPA.Files[fdix] = savfd\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"-bg\" {\n\t\txfin := false\n\t\t\/\/ set background option\n\t\tgshCtx.BackGround = true\n\t\tgshCtx, xfin = gshellv(gshCtx,gshPA,argv[1:])\n\t\tgshCtx.BackGround = false\n\t\treturn gshCtx, xfin\n\t}\n\tif cmd == \"call\" {\n\t\tgshCtx, _ = excommand(gshCtx, false,argv[1:])\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"cd\" || cmd == \"chdir\" {\n\t\tgshCtx = xChdir(gshCtx,argv);\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"#define\" {\n\t}\n\tif cmd == \"echo\" {\n\t\techo(argv,true)\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"env\" {\n\t\tenv(argv)\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"eval\" {\n\t\teval(argv,true)\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"exec\" {\n\t\tgshCtx, _ = excommand(gshCtx, true,argv[1:])\n\t\t\/\/ should not return here\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"exit\" || cmd == \"quit\" {\n\t\t\/\/ write Result code EXIT to 3>\n\t\treturn gshCtx, true\n\t}\n\tif cmd == \"-find\" {\n\t\tfind(argv)\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"fork\" {\n\t\t\/\/ mainly for a server\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"-gen\" {\n\t\tgen(gshPA, argv)\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"history\" || cmd == \"hi\" { \/\/ hi should be alias\n\t\tgshCtx = xHistory(gshCtx, argv)\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"jobs\" {\n\t\txJobs(gshCtx,argv)\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"nop\" {\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"pstitle\" {\n\t\t\/\/ to be gsh.title\n\t}\n\tif cmd == \"repeat\" || cmd == \"rep\" { \/\/ repeat cond command\n\t\trepeat(gshCtx,gshPA,argv)\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"set\" { \/\/ set name ...\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"time\" {\n\t\tgshCtx, fin = xTime(gshCtx,argv)\n\t\treturn gshCtx, fin\n\t}\n\tif cmd == \"sleep\" {\n\t\tsleep(gshCtx,gshPA,argv)\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"-ver\" {\n\t\tfmt.Printf(\"%s\\n\",VERSION);\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"pwh\" {\n\t\tpwd(gshPA);\n\t\treturn gshCtx, false\n\t}\n\tif cmd == \"where\" {\n\t\t\/\/ data file or so?\n\t}\n\tif cmd == \"which\" {\n\t\twhich(\"PATH\",argv);\n\t\treturn gshCtx, false\n\t}\n\tgshCtx, _ = excommand(gshCtx, false,argv)\n\treturn gshCtx, false\n}\nfunc gshelll(gshCtx GshContext, gshPA syscall.ProcAttr, gline string) (gx GshContext, rfin bool) {\n\targv := strings.Split(string(gline),\" \")\n\tgshCtx, fin := gshellv(gshCtx,gshPA,argv)\n\treturn gshCtx, fin\n}\nfunc tgshelll(gshCtx GshContext, gshPA syscall.ProcAttr, gline string) (gx GshContext, xfin bool) {\n\tstart := time.Now()\n\tgshCtx, fin := gshelll(gshCtx,gshPA,gline)\n\tend := time.Now()\n\telps := end.Sub(start);\n\tfmt.Printf(\"--I-- (%d.%09ds)\\n\",elps\/1000000000,elps%1000000000)\n\treturn gshCtx, fin\n}\nfunc Ttyid() (int) {\n\tfi, err := os.Stdin.Stat()\n\tif err != nil {\n\t\treturn 0;\n\t}\n\t\/\/fmt.Printf(\"Stdin: %v Dev=%d\\n\",\n\t\/\/\tfi.Mode(),fi.Mode()&os.ModeDevice)\n\tif (fi.Mode() & os.ModeDevice) != 0 {\n\t\tstat := syscall.Stat_t{};\n\t\terr := syscall.Fstat(0,&stat)\n\t\tif err != nil {\n\t\t\t\/\/fmt.Printf(\"--I-- Stdin: (%v)\\n\",err)\n\t\t}else{\n\t\t\t\/\/fmt.Printf(\"--I-- Stdin: rdev=%d %d\\n\",\n\t\t\t\/\/\tstat.Rdev&0xFF,stat.Rdev);\n\t\t\t\/\/fmt.Printf(\"--I-- Stdin: tty%d\\n\",stat.Rdev&0xFF);\n\t\t\treturn int(stat.Rdev & 0xFF)\n\t\t}\n\t}\n\treturn 0\n}\nfunc ttyfile(gshCtx GshContext) string {\n\t\/\/fmt.Printf(\"--I-- GSH_HOME=%s\\n\",gshCtx.GshHomeDir)\n\tttyfile := gshCtx.GshHomeDir + \"\/\" + \"gsh-tty\" +\n\t\t strconv.Itoa(gshCtx.TerminalId)\n\t\/\/fmt.Printf(\"--I-- ttyfile=%s\\n\",ttyfile)\n\treturn ttyfile\n}\nfunc ttyline(gshCtx GshContext) (*os.File){\n\tfile, err := os.OpenFile(ttyfile(gshCtx),\n\t\tos.O_RDWR|os.O_CREATE|os.O_TRUNC,0600)\n\tif err != nil {\n\t\tfmt.Printf(\"--F-- cannot open %s (%s)\\n\",ttyfile(gshCtx),err)\n\t\treturn file;\n\t}\n\treturn file\n}\nfunc getline(gshCtx GshContext, hix int, skipping, with_exgetline bool, gsh_getlinev[]string, prevline string) (string) {\n\tif( skipping ){\n\t\treader := bufio.NewReaderSize(os.Stdin,LINESIZE)\n\t\tline, _, _ := reader.ReadLine()\n\t\treturn string(line)\n\t}else\n\tif( with_exgetline && gshCtx.GetLine != \"\" ){\n\t\t\/\/var xhix int64 = int64(hix); \/\/ cast\n\t\tnewenv := os.Environ()\n\t\tnewenv = append(newenv, \"GSH_LINENO=\"+strconv.FormatInt(int64(hix),10) )\n\n\t\ttty := ttyline(gshCtx)\n\t\ttty.WriteString(prevline)\n\t\tPa := os.ProcAttr {\n\t\t\t\"\", \/\/ start dir\n\t\t\tnewenv, \/\/os.Environ(),\n\t\t\t[]*os.File{os.Stdin,os.Stdout,os.Stderr,tty},\n\t\t\tnil,\n\t\t}\n\/\/fmt.Printf(\"--I-- getline=%s \/\/ %s\\n\",gsh_getlinev[0],gshCtx.GetLine)\nproc, err := os.StartProcess(gsh_getlinev[0],[]string{\"getline\",\"getline\"},&Pa)\n\t\tif err != nil {\n\t\t\tfmt.Printf(\"Proc ERROR (%s)\\n\",nil)\n\t\t\tfor ; ; {\n\t\t\t}\n\t\t}\n\t\t\/\/stat, err := proc.Wait()\n\t\tproc.Wait()\n\t\tbuff := make([]byte,LINESIZE)\n\t\tcount, err := tty.Read(buff)\n\t\t\/\/_, err = tty.Read(buff)\n\t\t\/\/fmt.Printf(\"--D-- getline (%d)\\n\",count)\n\t\tif err != nil {\n\t\t\tif ! (count == 0) { \/\/ && err.String() == \"EOF\" ) {\n\t\t\t\tfmt.Printf(\"--E-- getline error (%s)\\n\",err)\n\t\t\t}\n\t\t}else{\n\t\t\t\/\/fmt.Printf(\"--I-- getline OK \\\"%s\\\"\\n\",buff)\n\t\t}\n\t\ttty.Close()\n\t\treturn string(buff[0:count])\n\t}else{\n\t\t\/\/ if isatty {\n\t\t\tfmt.Printf(\"!%d\",hix)\n\t\t\tfmt.Print(PROMPT)\n\t\t\/\/ }\n\t\treader := bufio.NewReaderSize(os.Stdin,LINESIZE)\n\t\tline, _, _ := reader.ReadLine()\n\t\treturn string(line)\n\t}\n}\n\/\/\n\/\/ $USERHOME\/.gsh\/\n\/\/                gsh-history.txt\n\/\/                gsh-aliases.txt \/\/ should be conditional?\n\/\/\nfunc gshSetup(gshCtx GshContext) (GshContext, bool) {\n\thomedir, err := os.UserHomeDir()\n\tif err != nil {\n\t\tfmt.Printf(\"--E-- You have no UserHomeDir (%v)\\n\",err)\n\t\treturn gshCtx, true\n\t}\n\tgshhome := homedir + \"\/\" + GSH_HOME\n\t_, err2 := os.Stat(gshhome)\n\tif err2 != nil {\n\t\terr3 := os.Mkdir(gshhome,0700)\n\t\tif err3 != nil {\n\t\t\tfmt.Printf(\"--E-- Could not Create %s (%s)\\n\",\n\t\t\t\tgshhome,err)\n\t\t\treturn gshCtx, true\n\t\t}\n\t\tfmt.Printf(\"--I-- Created %s\\n\",gshhome)\n\t}\n\tgshCtx.GshHomeDir = gshhome\n\treturn gshCtx, false\n}\nfunc script(gshCtx GshContext) (_ GshContext) {\n\tgshCtx, err0 := gshSetup(gshCtx)\n\tif err0 {\n\t\treturn gshCtx\n\t}\n\tgshPA := syscall.ProcAttr {\n\t\t\"\", \/\/ the staring directory\n\t\tos.Environ(), \/\/ environ[]\n\t\t[]uintptr{os.Stdin.Fd(),os.Stdout.Fd(),os.Stderr.Fd()},\n\t\tnil, \/\/ OS specific\n\t}\n\tcwd, _ := os.Getwd()\n\tgshCtx = GshContext {\n\t\tcwd, \/\/ StartDir\n\t\t\"\", \/\/ GetLine\n\t\t[]GChdirHistory { {cwd,time.Now()} }, \/\/ ChdirHistory\n\t\tgshPA,\n\t\t[]GCommandHistory{ }, \/\/something for invokation?\n\t\tfalse,\n\t\t[]int{},\n\t\tsyscall.Rusage{},\n\t\t\"\", \/\/ GshHomeDir\n\t\tTtyid(),\n\t}\n\tgshCtx, _ = gshSetup(gshCtx)\n\tfmt.Printf(\"--I-- GSH_HOME=%s\\n\",gshCtx.GshHomeDir)\n\t\/\/resmap()\n\tgsh_getlinev, with_exgetline :=\n\t\t which(\"PATH\",[]string{\"which\",\"gsh-getline\",\"-s\"})\n\tif with_exgetline {\n\t\tgsh_getlinev[0] = toFullpath(gsh_getlinev[0])\n\t\tgshCtx.GetLine = toFullpath(gsh_getlinev[0])\n\t}else{\n\tfmt.Printf(\"--W-- No gsh-getline found. Using internal getline.\\n\");\n\t}\n\n\tprevline := \"\"\n\tskipping := false\n\tfor hix := 1; ; {\n\t\tgline := getline(gshCtx,hix,skipping,with_exgetline,gsh_getlinev,prevline)\n\t\tif skipping {\n\t\t\tif strings.Index(gline,\"fi\") == 0 {\n\t\t\t\tfmt.Printf(\"fi\\n\");\n\t\t\t\tskipping = false;\n\t\t\t}else{\n\t\t\t\t\/\/fmt.Printf(\"%s\\n\",gline);\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif strings.Index(gline,\"if\") == 0 {\n\t\t\t\/\/fmt.Printf(\"--D-- if start: %s\\n\",gline);\n\t\t\tskipping = true;\n\t\t\tcontinue\n\t\t}\n\t\tif 0 < len(gline) && gline[0] == '!' {\n\t\t\txgline, set, err := searchHistory(gshCtx,gline)\n\t\t\tif err {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif set {\n\t\t\t\t\/\/ set the line in command line editor\n\t\t\t}\n\t\t\tgline = xgline\n\t\t}\n\t\tghist := GCommandHistory { }\n\t\tghist.StartAt = time.Now()\n\t\txgshCtx, fin := tgshelll(gshCtx,gshPA,gline)\n\t\tgshCtx = xgshCtx\n\t\tghist.EndAt = time.Now()\n\t\tghist.CmdLine = gline\n\t\tgshCtx.CommandHistory = append(gshCtx.CommandHistory, ghist)\n\t\tif fin {\n\t\t\tbreak;\n\t\t}\n\t\tif len(gline) == 0 {\n\t\t\tpwd(gshPA);\n\t\t\tcontinue;\n\t\t}\n\t\tprevline = gline;\n\t\thix++;\n\t}\n\treturn gshCtx\n}\nfunc main() {\n\tgshPA := syscall.ProcAttr {\n\t\t\"\", \/\/ the staring directory\n\t\tos.Environ(), \/\/ environ[]\n\t\t[]uintptr{},\n\t\tnil, \/\/ OS specific\n\t}\n\tgshCtx := GshContext {\n\t\t\"\", \/\/ StartDir\n\t\t\"\", \/\/ GetLine\n\t\t[]GChdirHistory{ {\"\",time.Now()} },\n\t\tgshPA,\n\t\t[]GCommandHistory{ },\n\t\tfalse,\n\t\t[]int{},\n\t\tsyscall.Rusage{},\n\t\t\"\", \/\/ GshHomeDir\n\t\tTtyid(),\n\t}\n\tgshCtx = script(gshCtx)\n\tfmt.Printf(\"%s\\n\",gshCtx.StartDir)\n}\n\/\/ TODO:\n\/\/ - inter gsh communication, possibly running in remote hosts -- to be remote shell\n\/\/ - merged histories of multiple parallel gsh sessions\n\/\/ - alias as a function\n\/\/ - instant alias end environ export to the permanent > ~\/.gsh\/gsh-alias and gsh-environ\n\/\/ - retrieval PATH of files by its type\n\/\/ - gsh as an IME\n\/\/ - all commands have its subucomand after \"---\" symbol\n\/\/ - filename expansion by \"-find\" command\n\/\/ - history of ext code and output of each commoand\n\/\/---END--- (^-^)\/<\/pre><style> pre { background-color:#e8ffff; } <\/style>\n<\/details>\n\n\n\n<p>-- 2020-0810 SatoxITS<\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/\u7d9a\u3005GShell-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more.pdf\">\u7d9a\u3005GShell-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more<\/a><a href=\"https:\/\/its-more.jp\/ja_jp\/wp-content\/uploads\/2020\/08\/\u7d9a\u3005GShell-\u2013-\u682a\u5f0f\u4f1a\u793e-ITS-more.pdf\" class=\"wp-block-file__button\" download>\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9<\/a><\/div>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u958b\u767a\uff1a\u3055\u3066\u30011000\u884c\u3042\u308c\u3070shell\u307d\u3044\u3082\u306e\u306b\u306a\u308b\u304b\u306a\u3068\u601d\u3063\u3066\u3044\u305f\u306e\u3067\u3059\u304c\u3001\u8d85\u3048\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u3002\u307e\u3060\u307e\u3060\u5148\u306f\u9060\u3044\u304b\u306a\u3068\u3044\u3046\u611f\u3058\u3067\u3059\u3002 \u958b\u767a\uff1a\u79c1\u81ea\u8eab\u306fshell\u3092\u3068\u3066\u3082\u30b7\u30f3\u30d7\u30eb\u306b\u3057\u304b\u4f7f\u308f\u306a\u3044\u306e\u3067\u3059\u304c\u3001\u4e00\u65b9\u3067\u30d2\u30b9\u30c8\u30ea\u30fc\u6a5f\u80fd &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/its-more.jp\/ja_jp\/?p=13584\" class=\"more-link\"><span class=\"screen-reader-text\">\"\u7d9a\u3005GShell\" \u306e<\/span>\u7d9a\u304d\u3092\u8aad\u3080<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=\/wp\/v2\/posts\/13584"}],"collection":[{"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=13584"}],"version-history":[{"count":24,"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=\/wp\/v2\/posts\/13584\/revisions"}],"predecessor-version":[{"id":13629,"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=\/wp\/v2\/posts\/13584\/revisions\/13629"}],"wp:attachment":[{"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=13584"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=13584"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/its-more.jp\/ja_jp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=13584"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}