タグ付けされた質問 「shell」

シェルは、Unixのコマンドラインインターフェイスです。シェルにインタラクティブにコマンドを入力するか、スクリプトを記述してタスクを自動化できます。/ bin / shおよび最も互換性のあるシェル(ash、bash、ksh、zshなど)に適用される質問には、このタグを使用します。エラーのあるシェルスクリプトについては、ここに投稿する前にhttp://shellcheck.netで確認してください。

1
現在のユーザーがディレクトリへの書き込み権限を持っているかどうかを確認します
私はあなたがディレクトリの所有者を決定できることを知っています: ls -ld ~/foo | awk '{ print $3 }' その後、次のようにして現在のユーザーと比較できます。 if [[ $(ls -ld ~/foo | awk '{ print $3 }') == "$USER" ]] # or $(id -u -n ) instead of $USER then echo "You are the owner" else echo "You are NOT the owner" fi ただし、所有者でなくても書き込み権限を持つことができます。これをどのように判断しますか?

1
トラップを使用して終了を確認しました
Ctrl+Cユーザーに確認を求める信号をトラップしようとしています。トラッピング部分は正常に動作します。ただし、信号がトラップされると、通常の実行に戻りません。代わりに、スクリプトを終了します。ユーザーがいいえを押したときに実行を再開させる方法。 これが私のコードです hell() { echo "Do you want to quit? Press 1 for yes and 0 for no"; read n; if [ $n == 1 ]; then exit 1; fi } trap "hell" SIGINT find /

6
IOリダイレクトとヘッドコマンド
.hgignore今日、Cygwin bashシェルからファイルをすばやく編集しようとしていたところ、誤りのある行が追加されました。これが最善の方法であるかどうかはわかりませんがhead -1 .hgignore、問題のある行を削除する方法をすぐに考えました(以前はファイルに1行しかありませんでした)。案の定、実行すると最初の行だけが出力されます。 しかし、出力をリダイレクトしてを使用してファイルを書き換えようとするhead -1 .hgignore > .hgignoreと、ファイルは空でした。なぜこれが起こるのですか?代わりに追加しようとするとhead -1 .hgignore >> .hgignore、正しく追加されますが、これは明らかに望ましい結果ではありません。この場合、切り捨てリダイレクトが機能しないのはなぜですか?

4
このbashスクリプトでコマンドの終了値を取得できないのはなぜですか?
だから私はビデオをmp3にトランスコードするためのこの小さなノーチラススクリプトを書いていました: #! /bin/bash -x if [ -z "$1" ] then zenity --warning --text="Error - No file selected !" exit 1 fi BASEFILENAME=${1%.*} exec ffmpeg -i "$1" -ab 256k "$BASEFILENAME.mp3" && if [ "$?" -eq 0 ] then zenity --info --text="Converting successful" exit fi 問題は、ffmpegコマンドが正常に実行されたにもかかわらず、 if [ "$?" -eq 0 ] …
9 shell  exit 

1
bashの引用符内のドル記号補間
私が書いたこの小さなテストスクリプトを実行しています。 #!/bin/bash TESTCASE=$@ testHarness <<runTest $TESTCASE runTest コマンドラインから: ./test.sh "1092$212" しかし、ドル記号は取り除かれています。私がそれをエスケープした場合、それは機能します。しかし、二重引用符でこれを行う必要から私を保護すると思いました。誰かが私に何が起こっているのか、そしてこれを修正する方法を理解するのを助けてくれますか?
9 bash  shell  quoting 

2
シェルで大量のファイルを管理する方法は?
$ ls ./dir_with_huge_amount_of_files/errors/ ディレクトリがUNIXタイムスタンプのある画像でいっぱいだとすると、多くの場合、多くのGBまたはそれ以上で測定されます。のようなシェルコマンドlsは、数百万(またはそれ以上)の画像で動作するように設計されていないため、オーバーフロースタイルの警告が表示されます。このような大量のファイルをどのように管理できますか?たとえば、(名前と作成時刻のタイムスタンプに基づいて)真ん中の画像を検索したい場合、組み込みの検索機能を提供するファイルシステムはありますか?どのコマンドを使用しますか?私は快適にしようとしたlsし、find必要なフラグ付きですが、それらは非常に遅いか生成された警告のいずれかでした。基本的に、写真のiノードを時系列に配置するための配列が1つ必要です。どうやってするか?その後、unixタイムスタンプを含むメタデータを追加できます。 [更新] 現在の回答には深刻な欠陥があり、人々は経験的なテストなしに、ある種の回答を投稿するだけです。彼らが提案をテストした場合、おそらく失敗するでしょう。したがって、サンドボックスを作成して膨大な量のファイルを作成し、1e7の量のファイルのように提案をテストできるコマンドラインツールを作成しました。ファイルの生成には時間がかかることがありますので、しばらくお待ちください。誰かがこれを行うためのより速い方法を知っている場合は、コードを編集してください。入力python code.py --helpしてヘルプを表示します。楽しんで! 多くのdirredファイルを作成するための使用例 $ ls ./data2 ls: ./data2: No such file or directory $ python testFill.py -n 3 -d 7 $ tree data2/ data2/ |-- 0 | |-- 1302407302636973 | |-- 1302407302638022 | `-- 1302407302638829 |-- 1 | |-- 1302407302639604 | |-- 1302407302641652 | …

3
コマンドからの出力で2つのことを行う
texcountLaTeXドキュメントの単語数を出力するプログラムがあります。また、この出力をパイプしsedて改行をTeX改行にし、これをファイルに書き込んで、最終的なドキュメントに含めることもできます。しかしtexcount foo.tex | sed s/$/'\\\\'/ > wc.tex、コマンドラインを実行すると、出力texcountが抑制されます。 どのように私は、最初のコマンドの出力が端末に表示されるように得ることができるとのsedにパイプ?

1
SSH接続を処理する場合、システムはどのような手順を実行しますか?
SSH接続を処理する場合、システムはどのような手順を実行しますか? ssh経由でログインを試みます sshd pamとpamモジュールを起動して私たちを認証します pamの設定に応じて、ユーザー名とパスワードを提供する必要があります(pamチェックpasswdとshadowファイル) PAMのためのチェックhosts.allow/deny、/etc/shellsおよびその他のもの すべてがうまくいけば、ログインしています ??? シェルが起動しました だから私の質問は、どのメカニズムがpasswdファイル内のユーザーに割り当てられているかを確認する責任があるということです(ステップ6で)?それはpam自体、特定のpamモジュールsshd、または何か他のものですか?私は取り替えることができることを知っているpasswdPAMモジュールを書き込むことによって(ユーザ名とパスワードをチェックするための)ファイルを、どのように私は置き換えることができpasswd、シェルのエントリのファイルを?
9 shell  ssh  pam 

1
単一のディレクトリの長いリストを取得するにはどうすればよいですか?
1つのディレクトリの長いリストを表示したい。と入力するとls -lha、次のように表示されます。 drwxrwxr-x 4 username groupname 4.0K 2010-08-05 09:55 files drwxrwxr-x 7 username groupname 4.0K 2010-08-05 14:25 trunk drwxrwxr-x 8 username groupname 4.0K 2010-08-05 16:02 phpincludes drwxrwxr-x 11 username groupname 4.0K 2010-07-26 12:31 phpMyAdmin-3.3.5-english しかし、と入力するls -lha phpMyAdmin-3.3.5と、ディレクトリの内容のリストが表示されます。表示されるようにコマンドを入力する方法 drwxrwxr-x 11 username groupname 4.0K 2010-07-26 12:31 phpMyAdmin-3.3.5-english ?私はこれをシンボリックリンクされたディレクトリで実行したいので、それらのコンテンツではなく、どこにリンクされているかを確認できます。

3
シェルからstdinが/ dev / nullかどうかを確認する方法は?
Linuxでは、シェルスクリプトが標準入力がnullデバイス(1、3)*からリダイレクトされているかどうか、理想的には何も読み取らないかどうかを確認する方法はありますか? 予想される動作は次のとおりです。 ./checkstdinnull -> no ./checkstdinnull < /dev/null -> yes echo -n | ./checkstdinnull -> no EDIT mknod secretunknownname c 1 3 exec 6<secretunknownname rm secretunknownname ./checkstdinnull <&6 -> yes 私は、入力デバイスの maj / min数を読み取る必要があるだけだと思います。しかし、シェルからそれを行う方法を見つけることができません。 *は必要ありません/dev/nullが、で手動で作成した場合でも nullデバイスがありますmknod。
9 linux  shell  devices  stdin 

4
errexitを含むすべてのシェルオプションを保存および復元する方法
シェルオプションを変更して復元する方法について、さまざまなスタック交換サイトとUNIXヘルプフォーラムで多くの質問を読みました。ここで見つけた最も包括的な質問は、「set -x」を「元に戻す」方法です。 受信した知恵は、いずれかの結果をオフに保存することであると考えられるset +oかshopt -po、その後、evalそれが後に以前の設定を復元します。 ただし、bash 3.xおよび4.xを使用した私自身のテストでは、errexitコマンド置換を行うときにオプションが正しく保存されません。 問題を示すスクリプトの例を次に示します。 set -o errexit set -o nounset echo "LOCAL SETTINGS:" set +o OLDOPTS=$(set +o) echo echo "SAVED SETTINGS:" echo "$OLDOPTS" そして出力(無関係な変数のいくつかを削除しました): LOCAL SETTINGS: set -o errexit set -o nounset SAVED SETTINGS: set +o errexit set -o nounset これは非常に危険なようです。私が書くほとんどのスクリプトはerrexit、コマンドが失敗した場合に実行を停止することに依存しています。これによって引き起こされたスクリプトの1つにバグを見つけerrexitました。最後に復元するはずの関数がそれを上書きし、スクリプトの実行中はデフォルトのオフに戻しました。 私ができることは、必要に応じてオプションを設定し、終了する前にすべてのオプションを適切に復元できる関数を作成することです。しかし、コマンド置換によって呼び出されたサブシェルでerrexitは継承されていないようです。 set +oコマンド置換を使用したり、FIFOフープをジャンプしたりせずに結果を保存する方法に困っています。からは読み取ることができますが$SHELLOPTS、書き込み可能ではないか、またはevalフォーマット可能ではありません。 サブシェル関数を使用することも選択肢の1つであることは知っていますが、その場合、出力をログに記録したり、複数の変数を返したりするために多くの問題が生じます。 おそらく関連している:https …
9 bash  shell 

1
systemdと端末起動プログラムの違い
この違いがプログラム間で何であるかについて私は興味があります。systemctlで有効にしたときにsystemdで起動した場合と/etc/rc.local、CLI で起動した場合やCLI で起動した場合。 たとえば、私は最近、ラズベリーパイにshairport-syncを使用していました。最初に、sudo systemctl enabled shairport-syncを使用してshairport-syncを開始するように設定しました。 後で、内部の機能を使用して、shairport-sync接続するデバイスにスクリプトを実行したりポストしたりしました。 驚いたことに、スクリプトが実行されshairport-syncたときkill arecord、aplay しかし、私はスクリプトが実行され、殺された端子を介してスクリプトを実行しますarecordとaplay。 さらに混乱させるために、私shairport-syncはそれを強制終了し、ターミナルを介して起動して、何が起こっているかの出力を確認しました。私はそのようにしたときのスクリプトは、デバイスが接続されて殺されたときに、私は期待通りに機能arecordしてaplay。だから、修正として私は無効shairport-syncにsysmtectlしてで実行するように設定する/etc/rc.localクイックフィックスとして。その後、reboot期待通りに機能しました。 これにより、の一部として実行されるsystemdプログラムと、/etc/rc.localまたはCLIを介して開始されたときに実行されるプログラムには、いくつかの違いがあると私は思います。 なぜこれが起こるのですか?これは、実行レベルが異なるためですか?ダークマジック? デバイスが接続するときに実行されるスクリプトはshairport-sync次のとおりです。shairportstart.sh #!/bin/sh /usr/bin/sudo /bin/pkill arecord if [ $(date +%H) -ge "18" -o $(date +%H) -le "7" ]; then /usr/bin/amixer set Speaker 40% else /usr/bin/amixer set Speaker 100% fi /home/pi/shScripts/shairportfade.sh& exit 0 フェードスクリプトは次のとおりです。 shairportfade.sh #!/bin/sh /usr/bin/amixer set …

2
シェルを終了した後、バックグラウンドジョブはどうなりますか?
私の理解では、ジョブは特定のシェルから開始されるパイプラインfgでありbg、これらのジョブ(、、Ctrl-Z)をこのシェル内から管理できます。ジョブは複数のプロセス/コマンドで構成できます。 私の質問は、シェルを含む元のシェルが終了すると、これらのジョブはどうなるのですか?huponexitが設定されていないため、シェルの終了後もバックグラウンドプロセスが実行を続けるとします。 私がやったとしましょう: $ run.sh | grep 'abc' & [1] job_id 次に、このシェルを終了します。新しいシェルを入力して実行するjobsと、何も表示されなくなります。しかし、私はps aux | grep run.shこのプロセスが実行されていることを確認できます。またps aux | grep grep、grep 'abc'実行プロセスも実行して確認できます。 パイプライン全体のジョブIDを取得して、一度に終了できるようにする方法はありますか?または、元のシェルを終了したら、別のシェルとは別にすべてのプロセスを終了する必要がありますか?(私は後者を試しましたが、うまくいきますが、すべてのプロセスを追跡するのは面倒のようです。)
9 shell  process  kill  jobs 

1
bashスクリプトパラメータの悪用は可能ですか?
Webフォームからbashスクリプトに電子メールアドレスを渡したいのですが。次の正規表現を使用しています。 /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}/ これで十分ですか?または、エクスプロイトを埋め込むことができますか? スクリプトはPHPから呼び出されます。 system('/usr/local/bin/script.sh "$email"');

2
tmux:キーをバインドしてシェルコマンドを起動する方法
私はtmux開発に2つのペインを使用しています。1つはコードの編集用、もう1つはコンパイル用です。コンパイルコマンドを起動するには、ペインを頻繁に切り替える必要があります(たとえば、 " mvn install")。 キーをバインドして(たとえば「Ctrl+ B C」)、特定のコマンドを他のペインで(またはペインなしで)起動する方法を教えてください。
9 linux  shell  vim  tmux 

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