問題タブ [ifs]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
bash - curl で内部フィールドセパレーターを使用する
私がする時...
...期待どおりの出力が得られます。
私がする時...
... 私はしません。
内部フィールドセパレーターを誤解していますか? スペース文字を使用せずに curl コマンドを実行するにはどうすればよいですか?
c - C:IFS System()の脆弱性
教育上の理由から、Cコードを利用する必要があります
プログラムは最初にegidを設定し、次にsystem("/usr/bin/...");
コマンドの脆弱性を設定します。
そこで、ホームディレクトリで「usr」を実行可能にし、ホームへのパスを設定しましたPATH=$HOME:$PATH
そして、bashのIFS変数を/に変更したいと思います。export IFS='/'
残念ながら、Cプログラムを呼び出すと、エクスプロイトが機能しません。
誰かが私に何が悪いのか教えてもらえますか?
bash - この例では、bash IFS はどのように機能していますか?
私はbashの内部変数について読んでいて、この例に出くわしましたIFS
:
CASE1
CASE2
さて、私の理解によれば、値IFS
がデフォルト\t\n
よりも先頭と末尾の空白が削除されている場合。したがって、case1 の場合、bash はvar
出力をa b c
参照します。
私によると、ケース2の場合、bashはここvar
のように|a||b|c|||
扱わ|
れspace
ます。を使って確認しました
したがって、ケース 2 の期待される出力は次のとおりです。
それで、誰かがvar
ケース2でbashがどのように扱っているか、そして私の理解のどこで間違っているのかを内部的に説明してもらえますか。
shell - bash スクリプトのコマンドから配列データをキャプチャする際の内部フィールド セパレータの使用
コマンドを実行すると
私のgitリポジトリで、フォームのコミットのリストを取得します
これは良いことです。
次のコードを使用して、bash スクリプト内からこのコマンドを実行し、出力を配列にキャプチャしたいと考えています。
次の出力が得られます。
これは良いことではありません
コミットのリストが文字列として返されますが、使用する前にまず分割する必要があります。いくつか検索した結果IFS=""
、データをキャプチャする前にスクリプトに追加すると、問題が解決することがわかりました。
だから私は自分のコードを編集して読む
どの出力
これで私の現実感は完全になくなりました。
私は物事がなぜそのようなことをしているのかを知りたいので、さらに検索した結果、これは と呼ばれInternal Field Separator
、Unix システムでコマンド インタープリターがパターンをトークンに分割する場所を特定するために使用されていることがわかりました。
これはわかります。
わからないのは
- この変数を空の文字列に設定すると、配列データを適切に処理できるようになったのはなぜですか。
- インタープリターが配列データを処理していることに気づき、それを適切に処理するのではなく、そもそもそのように設定しなければならなかった理由。
- デフォルトでは、スペース、タブ、および改行の文字が含まれているため、内部フィールドセパレーターを空の文字列に設定すると、全体のスキームにどのような影響がありますか。
これらの 3 つの点について頭を悩ませるための助けをいただければ幸いです。
newline - upstartスクリプトでIFSを使用する方法は?
upstart pre-startスクリプトのIFS変数を改行文字に設定したいのですが、IFS =$'\12'が機能しません。ここでIFS変数を設定するにはどうすればよいですか?このスクリプトで以前に使用したエクスポートLC_ALL = "en_US.UTF-8"
通常のbashスクリプトを使用し、前述のようにIFSを設定すると機能するようにテストしましたが、upstartを使用すると機能しませんでした。
arrays - 変数を使用してbashでgrepパターンを渡す
変数内に含まれているいくつかのgrepパターンを渡すのに苦労しています。これは私が持っているコードです:
これは私がやりたかったことです:
- grepがどこにあるかを決定/定義する
- grepに渡すパラメータを保持する変数(GREP_MY_OPTIONS)を割り当てます
- GREP_MY_OPTIONSにいくつかのパターンを割り当てます
- grepと$GREP_MY_OPTIONSに保存したパターンを使用して、スペースを含むパス内のいくつかのファイルを検索し、それらを配列に保持します
「echo$GREP_MY_OPTIONS」を使用すると、期待どおりの結果が生成されますが、スクリプトを実行すると、次のエラーで失敗します。
/ bin / grep:無効なオプション-''
私は何が間違っているのですか?パスにスペースが含まれていない場合は、すべてが正常に機能しているように見えるので、IFSと関係があると思いますが、よくわかりません。
perl - この bash スクリプトはどのようにして無限ループを引き起こしますか?
いくつかのグーグル(私は決してbashの専門家ではありません)から、テストスイートを実行し、実行中に下部にステータスバーを出力できるbashスクリプトをまとめることができました。通常、約 10 時間かかります。ステータス バーには、成功したテストの数と失敗したテストの数が表示されます。
うまく機能することもありますが、無限ループに陥ることもあります。私が使用しているコードは次のとおりです。
バグに遭遇すると、エラー メッセージが無限に繰り返され、ログ ファイル ( out.txt
) が数メガバイトの巨大なものになります (一度 GB に入ったと思います)。繰り返されるエラーの例を次に示します (各セットの間に 4 行の空白があります)。
2>&1
リダイレクトを取り出そうとしましたが、に変更しようとしましたwhile IFS=read -r line;
がwhile read -r line;
、無限ループが発生し続けます。奇妙なことに、これはほとんどの場合に発生するようですが、長いテスト スイートを問題なく終了することもありました。
編集:
私がこれを書いている理由は、白黒のテスト スイートから色分けされたテスト スイート (したがって ANSI コード) にアップグレードするためです。以前は、次を使用してテスト スイートを実行していました。
この方法で実行すると、Perl から同じ警告が表示されますが、無限ループに陥ることなく、ファイルに出力されて先に進みます。watch を使用すると、[32m
実際にテキストを緑色でレンダリングするのではなく、次のようなものも印刷されます。
bash - コマンドライン引数に渡すときに Bash で変数をエスケープする方法
スペースを含むいくつかの Windows パスを使用する Bash スクリプト (Cygwin) があります。\
その結果、変数定義で a を使用してスペースをエスケープしました。
スクリプト内のすべてが正常に機能します。ただし、この変数を引数としてコマンドライン実行可能ファイルに渡す必要があります。そうなると、逃げ道がめちゃくちゃになる。
機能しないスクリプトの例:
スクリプトからの出力:
ご覧のとおり、パス内のエスケープされたスペースは $args 変数にエクスポートされていません。エラーが「args = ...」の行にあると想定しています。しかし、エスケープされた文字が確実に保持されるように $destinationPath をエスケープする方法がわかりません。
destinationPath で二重引用符 (エスケープスペースなし) を使用しようとしましたが、役に立ちませんでした。$destinationPath を args= 行で二重引用符にしようとすると、余分な引用符がたくさん付いて出力が台無しになります。
どうすればこれを機能させることができますか? 私は $IFS 変数をいじってみましたが、私はそれで何をしているのか本当にわかりません. IFS。
arrays - bashでテキスト行を配列に分割する
jtn216_<n>.o<m>
wheren
およびm
integerという名前のファイルがたくさんあります。1 つ目は私が割り当て、2 つ目はシステムによって割り当てられます。各ファイルの最後の行を確認する必要があります。これを実行して、その行を配列に分割しました
3499200 3499200 87650.5574975270 13.6931802555886 1014400 1014400 87947.4382620423 13.9208064005841 3475800 3475800 87779.1695691355 13.8939964916376 3479200 3479200 87459.7284508034 13.7824644675699 3827800
3827800 87868.7538056652 13.8792123626210 2551600 2551600 87615.6417285010 13.8700006744178 3818400 3818400
87872.1788028955 13.8942371285402 3476800 3476800
87842.0543708163 13.9170342642747 3481800
3481800 87670.5841054385
13.8808556469308 2559200 2559200
87800.6530231416 13.8874423695824
3841600 3841600
87804.3972028423 13.8657419719638
916400
916400
87776.1342228681 13.8622746230494
3839000 3839000 87662.8185016707 13.8576498806465
3835200 3835200 87933.6917697832 14.0007327053153 3482000 3482000 88323.3509854563 13.9453990979062 3485400 3485400 87657.5078357100 13.8478805156354 3484800 3484800
87757.3379321554 13.8215034461609 3475400 3475400
87970.4729449120 13.9605031841208
3481800 3481800
87612.4211302676
13.8327950845915 2319400
2319400 87521.5669854330 13.8383953325475
line
からの最初の値ではなく、配列であると予想していましたv
。私は何を間違っていますか?