Unix & Linux

Linux、FreeBSDおよび他のUn * xのようなオペレーティングシステムのユーザーのためのQ&A

4
Bash読み取り:カンマ区切りリストの読み取り、最後の要素が欠落しています
以下のコマンドの出力は私には奇妙です。なぜ要素5が返されないのですか? $ echo '0,1,2,3,4,5' | while read -d, i; do echo $i; done 0 1 2 3 4 「5」も返されると思います。実行していGNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu)ます。コンマの追加は機能しますが、入力データにコンマがありません。何か不足していますか?

2
setuidビットの動作に一貫性がないのはなぜですか?
私はコードを書きました: // a.c #include <stdlib.h> int main () { system("/bin/sh"); return 0; } コマンドでコンパイル: gcc a.c -o a.out その上にsetuidビットを追加しました: sudo chown root.root a.out sudo chmod 4755 a.out Ubuntu 14.04で一般ユーザーとして実行すると、root権限を取得しました。 Ubuntu 16.04でも、現在のユーザーのシェルを取得しています。 なぜ違うのですか?

5
ファイルのセクションを並べ替える
大きなファイルで2つの文字列を並べ替えることはできますか? たとえば、現在のファイルは次のとおりです。 0cf Front Brake 0d0 Rear Brake 0ce Handle Bars HUT 03 VR Controls 009 Vest 001 Belt 002 Body Suit 020 Stereo Enable 003 Flexor 007 Hand Tracker 004 Glove 006 Head Mounted Display 008 Oculometer 00a Animatronic Device 000 Unidentified 021 Display Enable 005 Head Tracker HUT …
8 sort 

3
/ binへのコマンドショートカットの追加
カスタムコマンドを追加する方法はあります/binか? たとえば、私docker container lsはたくさん使用していて、これをのようなショートカットコマンドに変えたいと思っていますdcls。 私は名前のファイルを追加した場合dclsに/bin、ファイル内の正確なコマンドを指定してdocker container ls、私はこれが働かないと仮定します。 もしあれば、このようなことをする正しい方法は何ですか?

3
テールコマンドをエコーすると、予期しない出力が生成されますか?
このコマンドを単独で実行すると、期待される結果(crontabの最後の行)が生成されます。 tail -n 1 /etc/crontab ただし、echoコマンドの一部として実行して結果をファイルに送信すると、作業ディレクトリ内のすべてのファイルの概要と予想される結果が追加されます。 sudo bash -c 'echo $(tail -n 1 /etc/crontab) > /path/to/file' なぜこのコマンドは余分なデータを生成したのですか?
8 bash  sudo  cron  echo  tail 

4
ファイルの最初と最後を表示するためのBashメソッド
キューベースのクラスターでは、保留中のジョブのキューは、コマンドなどから表示されますshowqueue。 コマンドは、列など、名前などの適切なデータのリストを返しますが、列/データは質問には関係ありません。 私は時々のwatchようwatch showqueueにユーティリティを使用するのが好きです(エイリアスを使用alias watch="watch "して、コマンドのエイリアス展開を強制的に監視します)。最初の数行に重要なデータ(実行中のジョブ)があり、次に保留中のジョブなどがあり、最後にいくつかの重要な要約があります。 ただし、showqueueの出力が画面から消える場合があります(信じられないほど、私は知っています)。理想的には、ファイルの最初と最後を同時に表示できる方法が欲しいです。 私がこれまでに持っている最高のものは:showqueue > file; head -n 20 file > file2; echo "..." >> file2 ; tail -n 20 file >> file2; cat file2、そしてwatchそのエイリアスで使用することです。 誰かがもう少し柔軟な、または単一のユーティリティを知っていますか?私の解決策は、「...」の改行を複数行にするためのbashループで少し厄介になっています。ターミナルウィンドウのサイズを変更することはまったく適応されていません。 助言がありますか?

3
ファイルのある列の一致するエントリを別のファイルの別の列で置き換える
次のような2つのタブ区切りファイルがあります。 file1: NC_008146.1 WP_011558474.1 1155234 1156286 44173 NC_008146.1 WP_011558475.1 1156298 1156807 12 NC_008146.1 WP_011558476.1 1156804 1157820 -3 NC_008705.1 WP_011558474.1 1159543 1160595 42748 NC_008705.1 WP_011558475.1 1160607 1161116 12 NC_008705.1 WP_011558476.1 1161113 1162129 -3 NC_009077.1 WP_011559727.1 2481079 2481633 8 NC_009077.1 WP_011854835.1 1163068 1164120 42559 NC_009077.1 WP_011854836.1 1164127 1164636 7 file2: NC_008146.1 GCF_000014165.1_ASM1416v1_protein.faa …
8 awk 

5
Bash配列でのパラメーター置換の使用
Bash配列に読み込む必要があるfile.txtがあります。次に、スペース、二重引用符、およびすべてのエントリの最初のカンマを除くすべてを削除する必要があります。これが私がどこまで得たかです: $ cat file.txt 10,this 2 0 , i s 30,"all" 40,I 50,n,e,e,d,2 60",s e,e" $ cat script.sh #!/bin/bash readarray -t ARRAY<$1 ARRAY=( "${ARRAY[@]// /}" ) ARRAY=( "${ARRAY[@]//\"/}" ) for ELEMENT in "${ARRAY[@]}";do echo "|ELEMENT|$ELEMENT|" done $ ./script.sh file.txt |ELEMENT|10,this| |ELEMENT|20,is| |ELEMENT|30,all| |ELEMENT|40,I| |ELEMENT|50,n,e,e,d,2| |ELEMENT|60,se,e| コンマの状況を除いて、それは素晴らしい働きをします。この猫のスキンを作成する方法は複数あることは承知していますが、これは一部のスクリプトが大きいため、ここに到達するにはパラメーター置換を使用したいと思います。 |ELEMENT|10,this| |ELEMENT|20,is| |ELEMENT|30,all| |ELEMENT|40,I| …

4
ログイン直後に「コマンドが見つかりません」というスクリプトを追跡するにはどうすればよいですか?
ログインすると、次のメッセージが表示されます。 -bash: $'\r' : command not found -bash: $'\r' : command not found -bash: $'\r' : command not found 一部の起動スクリプトのWindowsスタイルの行末が原因であることが明らかであるため、私の質問は、それを引き起こすスクリプトを追跡できますか?

2
「e」なしで科学フォーマットを操作する
科学表記法で数値を含むファイルを操作しようとしていますが、e記号はありません。つまり、1.2e+3と書かれてい1.2+3ます。 私がやって考える最も簡単な方法は、awk交換した+とe+使用して、gsub機能を新しいファイルで私の計算を行います。マイナスの場合も同様です。したがって、次のコマンドを使用して簡単な修正を行うことができます awk '{gsub("+", "e+", $1); print $1, $2, $3, $4, $5}' file_in すべての列で同じことを行います。 ただし、ファイルには負の値も含まれているため、少し複雑になります。サンプルファイルは次のとおりです。 1.056000+0 5.000000-1 2.454400-3 2.914800-2 8.141500-6 2.043430+1 5.000000-1 2.750500-3 2.698100-2-2.034300-4 3.829842+1 5.000000-1 1.969923-2 2.211364-2 9.499900-6 4.168521+1 5.000000-1 1.601262-2 3.030919-2-3.372000-6 6.661784+1 5.000000-1 5.250575-2 3.443669-2 2.585500-5 7.278104+1 5.000000-1 2.137055-2 2.601701-2 8.999800-5 9.077287+1 5.000000-1 1.320498-2 2.961020-2-1.011600-5 9.248130+1 5.000000-1 3.069610-3 …

1
vimの挿入モードで2つの異なるファイルの違いが表示されないのはなぜですか?
2つのファイルを作成しましょう: $ echo -n 'test' > test.txt $ wc test.txt 0 1 4 test.txt ファイルにtest.txtは、末尾の改行が含まれていません。 $ echo 'test' > test_n.txt $ wc test_n.txt 1 1 5 test_n.txt ファイルにtest_n.txtは、末尾の改行が含まれています。 上記の2つのファイルは明らかに異なりますがvim、挿入モードの両方のファイルのプレビューには違いがありません。 $ vim test.txt $ vim test_n.txt なぜ違いがないのですか(改行または特別な区別)? そしてvim、挿入モードでそのような追加の文字を追加または削除するにはどうすればよいですか?
8 vim  newlines  vi-mode 

6
小規模なプロジェクトで「make」を使用する利点は何ですか?[閉まっている]
休業。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善してみませんか?この投稿を編集して、事実と引用で回答できるように質問を更新してください。 昨年休業。 これはmake、特にで説明されている複雑な依存関係がありMakefile、ワークフローにも役立つ大規模なプロジェクトに役立つことがわかりました。make小さなプロジェクトで使うことの利点は聞いていません。いずれかがあります?

2
bashエイリアスは、shopt expand_aliasesを使用しても展開されません
bash -c構成内でエイリアスを実行したい。 bashマニュアルには書かれています: expand_aliasesシェルオプションが以下を使用して設定されていない限り、シェルがインタラクティブでない場合、エイリアスは展開されません。shopt この例では、明示的hiに設定したときにエイリアスが見つからないのはなぜexpand_aliasesですか? % bash -O expand_aliases -c "alias hi='echo hello'; alias; shopt expand_aliases; hi" alias hi='echo hello' expand_aliases on bash: hi: command not found 私は走っていGNU bash, version 5.0.0(1)-release (x86_64-pc-linux-gnu)ます。 コンテキスト:アイドル優先度でエイリアスを実行できるようにしたいと思います。 #!/bin/bash exec chrt -i 0 nice -n 19 ionice -c 3 bash -c ". ~/.config/bash/aliases; shopt -s …
8 bash  alias 

6
複数のディレクトリの存在を確認する
作業ディレクトリに複数のディレクトリ、たとえばdir1、dir2およびが存在するかどうかを確認したいと思いdir3ます。 私は以下を持っています if [ -d "$PWD/dir1" ] && [ -d "$PWD/dir2" ] && [ -d "$PWD/dir3" ]; then echo True else echo False fi しかし、もっとエレガントな方法があるのではないかと思います。ディレクトリの名前にパターンがあると仮定しないでください。 目標は、いくつかのディレクトリの存在と他のディレクトリの非存在を確認することです。 私はBashを使用していますが、移植可能なコードが推奨されます。

2
複数のテキストソースの最初の行から配列を作成するにはどうすればよいですか?
それぞれ数行のテキストを持つファイルへのパスの配列があります。次のように処理された各ファイルの最初の行が入力された配列を作成したいと思います。 # this.txt first line is [Test this] # another.txt first line is [Test another] paths=( ./this/path/this.txt ./another/path/another.txt ) for i in ${paths[@]}; do read -r line < $i lines+=$line done せいぜい、配列で取得した値は1つだけです。forループから探している配列を取得できないようです。私は多くのバリエーションを試しましたが、どこが間違っているのかを理解するのに苦労しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.