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

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

1
シェルスクリプトがbashまたはshのどちらで記述されているかを確認する方法
スクリプトが記述されているかどうかを確認するにはどうすればbashよいshですか? Linuxではbashスクリプトに次の行があるため、スクリプトの最初の行はここでは役に立ちません。 #!bin/sh 実際には、Bourne Shellではなく、/bin/shbash(おそらくこれらのディストリビューション/bin/shへのリンク/bin/bash)である多くのディストリビューションがあります。したがって、FreeBSDなどでbashで記述されたスクリプトを実行しようとすると、結果は定義されません。これ/bin/shは、FreeBSDではBourne Shellであり、bashではないためです。 スクリプトがbashかshかを識別する簡単な方法はありますか? 構文に特徴的な点はありますか?

2
shがbashまたはdashへのシンボリックリンクである場合、bashはそれ自体をPOSIX準拠に制限するため、shと100%互換でなければなりませんか?
bashとshの違いから: 質問への同意:/bin/shbashへのリンクとして持っている場合、bashは、/bin/shとして呼び出されたときと同じように呼び出された場合と同じように動作しません/bin/bash。として呼び出されるとsh、ほとんどの場合POSIX準拠と限定された拡張セットに制限されます。 Linuxでshへのシバンがあるシェルスクリプトに出くわしたときはいつでも#!/bin/sh、そのディストリビューション上であってもbin/sh、ダッシュやbashなどの別のシェルへのシンボリックリンクである場合、ボーンシェルと100%互換性があるはずです。それはそれ自体を限られた拡張セットに制限しますか?それで、私はそれらをFreeBSDで実行できますか?例外はありますか?それとも私はそれがうまくいくと仮定しても安全でしょうか? したがって、ディストリビューションで、bin/shへのシンボリックリンクbin/bashであり、スクリプトの使用#!/bin/shとスクリプトにbashismが含まれている場合、bashはshモードのようになるため、実行されません。

4
cpまたはrsync、cpは本当に価値がありますか?
私は私が使用するための良い理由を見つけるように見えることはできません、これは、本当の答えずに質問としてカウントされません願うcp(1)以上rsync(1)、事実上すべての状況では。1は、一般的に賛成すべきであるrsyncオーバーcp?それらを使用するための良いガイドラインはありますか? rsync:差分を転送します。圧縮を使用できます。リモートで(安全に)使用できます。単一の大きなファイルの転送中でも、中断されても再開できます。」 cp:多分それは単に使用する方が簡単ですか?rsyncより高速ですか?
8 bash  shell  rsync  utilities  cp 

1
Kornシェル:End、pgup、pgdown、deleteキーが機能しない
したがって、基本的に、私のEnd、Pageup/ Pagedown、およびDeleteキーはksh93では機能しません。ちなみに私はFreeBSDを実行しています。 矢印キーが機能していて、ホームキーも機能しています。 これらのキーは、これを自分の中に入れると機能します .kshrc set -o emacs 私がやって試してみましたが、これを私の中でこれを置くことによって、.kshrc。Endキーを機能させるため。 alias __Y=`echo "\005"` # end = ^e = end of line vimを開き、を押しCtrlvてタイプしました005。そして^E現れた。それでも、何もうまくいきませんでした。 誰かがとにかくそれらのキーを機能させることを知っていますか? また、これらのキーを押すと、が出力されます~。また、を使用できることCtrld、またはCtrla使用したくないことも知っています。

4
n個のファイルを反復処理しますか?
やりたいことがかなり簡単にできます。montage何千もの画像が含まれているディレクトリで、オプションがほとんどない状態で使用したいと考えています。 me@home$ montage -size 256x256 DSC01*.JPG.svg output.png ...しかし、一度に100枚程度の画像しか取得できないため、それだけでは不十分です。どちらでもない me@home$ montage -size 256x256 *.svg output.png ...結果のファイルが大きすぎて解析できないため、すべての画像を同時に取得します。 私がやりたいのは、一度に100〜200ファイルのようなものを反復処理することです。これはforループ(?)を使用して実装できると思いますが、その方法について少し混乱しています。私はそこに使用するための巧妙な方法は、おそらくだと思うfind -execか、xargs私は考えていないよということ。を使用bashしていますが、zshときどき使用しています。 したがって、結論として、2600の画像ファイルを指定し、モンタージュを約13または26回(100-200ファイルごとに1回)呼び出し、n個のファイルをn回の倍数で呼び出すことができる1つのライナーを探しています。

1
後で使用するために `bc`関数を定義する方法は?
いつもbc神秘的で興味をそそられるものを見つけました。これは、元のUnixプログラムの1つでした。そしてそれはそれ自体がプログラミング言語です。だから、私はそれを使用するために見つけることができるどんなチャンスでも喜んで取ります。 bcには階乗関数が含まれていないようなので、次のように定義します。 define fact(x) { if (x>1) { return (x * fact(x-1)) } return (1) } でも……それでは再利用できませんね。 次のようなことができるようになりたいです me@home$ bc <<< "1/fact(937)"
8 shell  bc 

3
配列を関数に渡す最も正しい方法は何ですか?
私が非常に大きな配列を持っていると考えてください$large_list、配列を引数としてとる関数を書く方法はありますか?例えば: echo_idx_array () { arr="$1" idx="$2" echo "${arr[$idx]}" } そのようなことをするための通常の戦略は何ですか?変数を指定してみまし$large_listたが、空でした。 引数リストの変更に合わせて関数を変更するつもりです。 記録のために、私はksh88を使用しており、可能な限りポータブルな答えを探しています。 編集:これまでのところ私が思いつくことができる最善の方法は、配列をループして、各要素を関数の引数として送信することです。これは信じられないほど醜く、エラーが発生しやすいようです。言うまでもなく、すぐに制限に達します。これが私がしたことです: foo () { echo $* } cmd="foo " while [[ $i -lt $MAX_ARR_SIZE ]]; do cmd="$cmd ${large_list[$i]}" ((i=i+1)) done eval $cmd 何か良いことはありませんか?
8 shell  ksh  array 


2
履歴エントリにネットワークまたはユーザーソース接続データを追加するにはどうすればよいですか?
管理しているシステムのすべてのユーザーの履歴設定を変更したいと思います。以下のような接続端末からの情報を含めたいwho sysadmin:/ # who sysadmin pts/0 Mar 26 07:11 (sysadmin.doofus.local) 現在、以下の方法で履歴を変更しています。これらの設定の多くがここで何度か取り上げられていることは知っています。ただし、私はこのコードを「Linuxシステム管理レシピ:Juliet Kemp」から抜粋してずっと前に作成しました。 shopt -s histappend PROMPT_COMMAND='history -n;history -a' HISTSIZE=100000 HISTFILESIZE=100000 HISTTIMEFORMAT="%m/%d/%y %T " shopt -s histappend 複数の端末を開いているときの問題が修正され、情報が失われる場合があります。 PROMPT_COMMAND='history -n;history -a' 複数の端末間で履歴にリアルタイムで追加できるように拡張されています。 HISTSIZE=100000 HISTFILESIZE=100000history保存 期間を延長します HISTTIMEFORMAT="%m/%d/%y %T "履歴の各行の前にタイムスタンプを付けます 通常得られるもの history 835 ls 836 cd .. 私が変更した現在のhistory結果 5853 03/26/12 07:16:49 ls 5854 …

7
ファイル名を短縮するLinuxスクリプトまたはプログラム
Linux版のnamemanglerを見つけるのにあまり成功していません。Windowsで読めるように1000個のファイルの名前を変更する必要があります。 これを実行できるLinuxプログラムを知っている人はいますか? そうでない場合、フォルダ内のすべてのファイルの名前をたとえば最初の16文字に変更するだけでよいため、スクリプトが機能する可能性があります。スクリプトルートを下る価値はあるかもしれませんが、どこから始めればよいかわかりません。

5
KornシェルでサブシェルのPIDを取得する方法($ BASHPIDと同等)
bashでは、この便利な変数があります。$ BASHPIDは常に、現在実行中のサブシェルのPIDを常に返します。kshでサブシェルのPIDを取得するにはどうすればよいですか?たとえば、次のコードを参照してください。 #!/usr/bin/ksh93 echo "PID at start: $$" function run_in_background { echo "PID in run_in_background $$" run_something & echo "PID of backgrounded run_something: $!" } function run_something { echo "*** PID in run_something: $$" sleep 10; } run_in_background echo "PID of run in background $!" これは以下を出力します: PID at start: 5328 …

3
同じawkアクションを異なるファイルに適用する方法は?
私はawkの初心者で、これを行うawkスクリプトを作成できるかどうかはわかりません。 何百ものデータファイルを並べ替える必要があります。それぞれについて、次のワンライナーを使用します。 awk 'ORS=NR%3?" ":"\n" ' file1.tex > file1_sorted.tex awk 'ORS=NR%3?" ":"\n" ' file2.tex > file2_sorted.tex ... 必要な出力が得られます。ただし、このアクションを自動化して、各ファイルを取得し、アクションを適用して、対応するソート済みファイルを書き込むスクリプトを作成したいと思います。 よろしくお願いします!
8 shell  awk 

1
chshまたは管理者権限なしでデフォルトのシェルを変更する
私はこのスレッドで次のスニペットを見ました:デフォルトのシェルとしてcshからbashに変更する方法 sleep 2 if (-x /usr/local/bin/bash) then exec /bin/sh -c '. ~/.profile; exec /usr/local/bin/bash' endif 私の理解では、このスニペットを~/.loginそこに配置するとbash、ログイン時に呼び出されます。 同様のスニペットを使用して、zshログインに使用するデフォルトのバージョンとは異なるバージョンを呼び出したいという同様の状況があります。この問題が発生する理由の一部は、選択できないためですでzsh許可されているオプションのの希望するバージョンで、chsh管理者権限がありません。 これとともに: 異なるバージョンのzshを切り替えるときに、上記のスニペットをどのように変更すればよいですか? exec上記のスニペットに2つのコマンドが必要なのはなぜですか?彼らは何をしますか?また、なぜ使用上のスニペットはありませんsh し、 bash(ユーザーが持つログインになっていますcsh)
8 shell  zsh  login  exec 

3
forループを使用して新しい行を見つける方法は?
私が見つけたウェブ上のさまざまな場所で: \015 \012 \x0a - hex \n \r さまざまな改行/改行の同義語としてすべて... しかし、この小さなスクリプトでは、改行に遭遇したときに認識できません。誰かがif行でチェックする必要があることを誰かに教えてもらえますか? #!/bin/bash test="this is a test" for a in "$test"; do if [[ "$a" == '\012' ]] ; then echo "FOUND NEWLINE" fi echo "$a" done
8 bash  shell  string 

3
バッシュ文字列は複数の文字を1つに置き換えます
フィードのタイトルから、文字と数字を除くすべての文字をダッシュ​​に置き換えて、ファイルシステムの安全なファイル名として結果を使用します。 $ t="Episodie 06: No hope of riding home (NEW) - Advanced grammar" $ echo ${t//[^A-Za-z0-9]/-} Episodie-06--No-hope-of-riding-home--NEW----Advanced-grammar しかし、私はすべての繰り返しダッシュを次のように1つに凝縮したいと思います Episodie-06-No-hope-of-riding-home-NEW-Advanced-grammar 私は2パスの置換を使用してそれを達成できることを発見しました: $ t="Episodie 06: No hope of riding home (NEW) - Advanced grammar" $ tmp=${t//[^A-Za-z0-9]/-} $ echo ${tmp//--/-} Episodie-06-No-hope-of-riding-home-NEW--Advanced-grammar 私は次のような単一のパスでそれを行うことができると思いました: $ echo ${t//[^A-Za-z0-9]+/-} しかし、それは機能しません。 どんな手掛かり? 注:sed他のツールと一緒に行きたくない
8 bash  shell  string 

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